Rails 4 ajouter file_field pour la fixation de téléchargement de formulaire existant et contrôleur
Je suis super nouvelle pour les rails. Appris quelques semaines maintenant. Veuillez excuser mon idiotie. Je ne peux pas obtenir mon fichier que j'ai choisi pour le téléchargement.
Je suis à l'aide de Rails 4.0.0.
Je suis en train de travailler sur ma première demande, et j'ai commencé en suivant les rails de guide pour l'application de blog. Je l'ai pris et a couru avec elle et je suis la création de quelque chose de différent (bug tracking system) juste essayer d'apprendre à cordes.
Donc, j'ai mon formulaire:
<%= form_for @post do |f| %>
et j'ai ajouté dans mon file_field. La partie affichage de la vue ressemble et fonctionne bien dans la mesure où la sélection d'un fichier va.
<%= f.label :attachment %>
<%= f.file_field :attachment %>
J'ai tiré cela de les rails 4 guides pour info. Donc, mon contrôleur ressemble à ceci:
class PostsController < ApplicationController
def new
@post = Post.new
end
def create
@post = Post.new(params[:post].permit(:title, :text, :user, :screen))
if @post.save
redirect_to posts_path
else
render 'new'
end
end
def show
@post = Post.find(params[:id])
end
def index
@posts = Post.all
end
def edit
@post = Post.find(params[:id])
end
def update
@post = Post.find(params[:id])
if @post.update(params[:post].permit(:title, :text, :user, :screen))
redirect_to posts_path
else
render 'edit'
end
end
def destroy
@post = Post.find(params[:id])
@post.destroy
redirect_to posts_path
end
def upload
uploaded_io = params[:post][:attachment]
File.open(Rails.root.join('public', 'uploads', uploaded_io.original_filename), 'w') do |file|
file.write(uploaded_io.read)
end
end
private
def post_params
params.require(:post).permit(:title, :text, :user, :screen, :attachment)
end
end
Le nouveau morceau ici est de télécharger. Tout le reste fonctionne bien avec l'écriture/lecture de la base de données et l'affichage. Lorsque la vue est affiché je fais les entrées de texte, ci-joint un fichier et cliquez sur soumettre. Tout écrit à la base de données et les affiche sur l'index, mais le fichier que j'ai tenté de joints ne sont pas écrites dans ~/bugs/public/uploads/
Merci d'avance pour l'aide.
OriginalL'auteur kyle | 2013-08-23
Vous devez vous connecter pour publier un commentaire.
Je pense que le problème pourrait être que l' :l'attachement de l'attribut n'est pas un permis de paramètre dans la section "créer" ou "mise à jour" de l'action.
Edit: La façon dont je fais simple upload de fichiers est avec le Trombone gem - ce railscast l'explique bien. Il est vraiment facile à utiliser.
Il y a aussi cette réponse qui pourrait répondre à la question.
Aussi, la manière standard d'utiliser des paramètres est la définition de permis params dans une méthode privée et de l'appel de cette méthode dans l'action du contrôleur (si vous n'avez pas à répéter à vous-même). Qui pourrait être la cause de l'erreur.
Exemple:
Espère que ça aide.
Rapide mise à jour, comme je suis encore en recherche, j'ai donc créé un nouveau modèle, et a couru rake db:migrate et je suis maintenant un nouveau message d'erreur (le progrès!) qui se lit: TypeError: ne pouvez pas jeter ActionDispatch::Http::UploadedFile à la chaîne: INSERT INTO "posts" ("attachement", "created_at", "écran", "texte", "titre", "updated_at", "utilisateur") des VALEURS (?, ?, ?, ?, ?, ?, ?)
Modifié la réponse avec un couple de solutions possibles.
Je l'ai eu à travailler. J'ai juste déplacé le contenu de mon action télécharger dans mon action de création. Je vais finir par le faire pour trombone/carrierwave mais je voulais le faire plaine jane pour commencer. Chris C. je vous remercie beaucoup pour votre aide car il m'a aidé à trouver la réponse. Aussi, merci beaucoup pour l' (post_params) après avoir défini les paramètres privé.
Pas de prob. Heureux, il a aidé. Bonne chance à l'apprentissage des Rails... c'est génial.
OriginalL'auteur Chris C.
J'ai eu le même problème,
solution :-
supprimer le "def upload" et de donner le code à l'intérieur "def créer" lui-même
OriginalL'auteur Ballaji T
Assurez-vous que le 'uploads' répertoire existe en "public".
Vous pouvez gérer cela automatiquement par l'ajout de cette ligne avant l'opération de fichier:
Dir.mkdir 'public/uploads' unless File.directory? 'public/uploads'
OriginalL'auteur Skofo