Actions du contrôleur Rails 4 pour les champs_pour les ressources imbriquées
-
22-12-2019 - |
Question
J'essaie de comprendre field_for de Rails, en particulier ce qui doit entrer dans le contrôleur pour les ressources imbriquées.Mon problème est que lorsque je crée une bande dessinée avec des pages de bande dessinée via le formulaire Bande dessinée, l'image de la page n'est pas enregistrée.
J'ai des utilisateurs, des bandes dessinées et des ComicPages.Voici les modèles :
class User < ActiveRecord::Base
has_many :comics
has_many :comic_pages, through: :comics
end
class Comic < ActiveRecord::Base
belongs_to :user
has_many :comic_pages, :dependent => :destroy
accepts_nested_attributes_for :comic_pages
end
class ComicPage < ActiveRecord::Base
belongs_to :comic
end
Voici le formulaire pour Comic, où je souhaite également ajouter comic_pages :
<%= form_for ([@user, @comic]) do |f| %>
<%= f.text_field :title %>
<%= f.fields_for :comic_pages do |comic_page| %>
<%= comic_page.file_field :comic_page_image %>
<% end %>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
Je suis confus au sujet du comics_controller (nouvelles et créations d'actions).Comment puis-je transmettre les paramètres comic_page à ce contrôleur ???
def new
@user = current_user
@comic = @user.comics.new
@comic.comic_pages.build
end
def create
@user = current_user
@comic = @user.comics.new(comic_params)
@comic.comic_pages.build
respond_to do |format|
if @comic.save
format.html { redirect_to @user, notice: 'Comic was successfully created.' }
format.json { render action: 'show', status: :created, location: @user }
else
format.html { render action: 'new' }
format.json { render json: @comic.errors, status: :unprocessable_entity }
end
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_comic
@comic = Comic.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def comic_params
params.require(:comic).permit(:title, :synopsis)
end
def comic_page_params
params.require(:comic_page).permit(:comic_page_image, :comic_image_file_name)
end
Merci beaucoup!
--- MODIFIER ---
Après la réponse pour les paramètres, je l'ai utilisé pour créer l'action de création suivante :
def create
@user = current_user
@comic = @user.comics.new(comic_params)
i = 0
until i = 1
@comic_page = @comic.comic_pages.new(comic_params[:comic_pages_attributes]["#{i}"])
@comic_page.save
i += 1
end
respond_to do |format|
if @comic.save
...
end
end
end
La solution
Vous devez autoriser ces champs à partir de comic_pages
que vous souhaitez enregistrer dans le comic_params
section de votre contrôleur
params.require(:comic).permit(:title, :synopsis, comic_pages_attributes: [:comic_page_image])