Rails 4-Controller-Aktionen für Fields_for verschachtelte Ressourcen
-
22-12-2019 - |
Frage
Ich versuche, Field_for von Rails zu verstehen, insbesondere, was für verschachtelte Ressourcen in den Controller gelangen soll.Mein Problem besteht darin, dass das Bild der Seite nicht gespeichert wird, wenn ich über das Comic-Formular einen Comic mit Comic-Seiten erstelle.
Ich habe Benutzer, Comics und ComicPages.Hier sind die Modelle:
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
Hier ist das Formular für Comic, wo ich auch comic_pages hinzufügen möchte:
<%= 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 %>
Ich bin verwirrt über den comics_controller (Neu- und Erstellungsaktionen).Wie kann ich comic_page-Parameter an diesen Controller übergeben???
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
Vielen Dank!
--- BEARBEITEN ---
Nach der Antwort auf die Parameter habe ich damit die folgende Erstellungsaktion erstellt:
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
Lösung
Sie müssen diese Felder zulassen comic_pages
die Sie im speichern möchten comic_params
Abschnitt Ihres Controllers
params.require(:comic).permit(:title, :synopsis, comic_pages_attributes: [:comic_page_image])