Rails - Parameters not being saved when using nested forms in Cocoon

我的梦境 提交于 2019-12-12 01:56:13

问题


I've followed Cocoon's instructions for creating a nested form for a has_many association but there's one thing that I can't seem to figure out. I'm able to add an existing genre to my project but when it comes to creating a completely new one the parameters for my genres aren't being permitted. When I refer to my rails console to debug the issue this is the message I receive upon update:

Unpermitted parameters: genre_attributes

What's strange is I've permitted both my join table genreships and my genre model along with having my movie model accept their nested attributes but still no luck. There has to be something I'm not doing in my movie_params method but not able to find what. I've literally tried to permit every possible attribute within this method and completely out of ideas on what could be the solution

Models

class Movie < ActiveRecord::Base
    has_many :genreships
    has_many :genres, through: :genreships

    accepts_nested_attributes_for :genres, :reject_if => :all_blank, :allow_destroy => true
    accepts_nested_attributes_for :genreships, :reject_if => :all_blank, :allow_destroy => true

    extend FriendlyId
    friendly_id :title, use: :slugged
end

class Genreship < ActiveRecord::Base
    belongs_to :movie
    belongs_to :genre

    accepts_nested_attributes_for :genre, :reject_if => :all_blank
end

class Genre < ActiveRecord::Base
    has_many :genreships
    has_many :movies, through: :genreships

    extend FriendlyId
    friendly_id :name, use: :slugged
end

Movies Controller

def movie_params
  params.require(:movie).permit(:title, :release_date, :summary, genreships_attributes: [:id, :genre_id, :_destroy], genres_attributes: [:id, :_destroy, :name])
end

Form

= simple_form_for @movie do |f|

  .field
    = f.input :title
  .field
    = f.input :release_date, label: 'Release Date', order: [:month, :day, :year], start_year: 1901
  .field
    = f.input :summary, as: :text
  #genres
    = f.simple_fields_for :genreships do |genreship|
      = render 'genreship_fields', :f => genreship
    = link_to_add_association 'add a genre', f, :genreships
  .actions = f.submit 'Save', class: 'btn btn-default'

Genreship Partial

.nested-fields
  #genre_from_list
    = f.association :genre, :collection => Genre.order(:name), :prompt => 'Choose an existing genre'
  = link_to_add_association 'or create a new genre', f, :genre
  = link_to_remove_association "remove genre", f

Genre Partial

.nested-fields
  = f.input :name

Here's what's shown in the rails console right after posting a new movie:

Started POST "/movies" for 127.0.0.1 at 2014-11-19 08:17:42 -0500

Processing by MoviesController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"2/wqXhn/x73AdOOrSo49Q/OPAmrcVk0rLViJJNpIhps=", "movie"=>{"title"=>"", "release_date(2i)"=>"11", "release_date(3i)"=>"19", "release_date(1i)"=>"2014", "summary"=>"", "genreships_attributes"=>{"1416403056574"=>{"genre_attributes"=>{"name"=>"Comedy"}, "genre_id"=>"", "_destroy"=>"false"}}}, "commit"=>"Save"}
Unpermitted parameters: genre_attributes

回答1:


You use genre_attributes while genres_attributes (plural form) is defined in your controller. Change it to:

def movie_params
  params.require(:movie).permit(:title, :release_date, :summary, genreships_attributes: [:id, :genre_id, :_destroy], genre_attributes: [:id, :_destroy, :name])
end



回答2:


I created a solution that in a sense deviates from Nathan's example code somewhat but gets the job done nonetheless. Simply moving this line from genreship_fields.html.slim to _form.html.slim did the trick:

link_to_add_association 'create a new genre', f, :genres

My partials now look like this:

Form

= simple_form_for @movie do |f|
  .field
    = f.input :title
  .field
    = f.input :release_date, label: 'Release Date', order: [:month, :day, :year], start_year: 1901
  .field
    = f.input :summary, as: :text
  #genres
    = f.simple_fields_for :genreships do |genreship|
      = render 'genreship_fields', :f => genreship
    | #{link_to_add_association 'add a genre', f, :genreships} | #{link_to_add_association 'create a new genre', f, :genres}
  .actions = f.submit 'Save', class: 'btn btn-default'

Genreship Partial

.nested-fields
  #genre_from_list
    = f.association :genre, :collection => Genre.order(:name), :prompt => 'Choose an existing genre'
  = link_to_remove_association "remove genre", f

Genre Partial

.nested-fields
  = f.input :name
  = link_to_remove_association "remove form", f


来源:https://stackoverflow.com/questions/26996318/rails-parameters-not-being-saved-when-using-nested-forms-in-cocoon

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!