【问题标题】:Rails - Parameters not being saved when using nested forms in CocoonRails - 在 Cocoon 中使用嵌套表单时未保存参数
【发布时间】:2014-11-18 14:09:46
【问题描述】:

我已按照 Cocoon 的说明为 has_many 关联创建嵌套表单,但有一件事我似乎无法弄清楚。我可以将现有流派添加到我的项目中,但是在创建全新的流派时,我的流派的参数是不允许的。当我参考我的 Rails 控制台来调试问题时,这是我在更新时收到的消息:

Unpermitted parameters: genre_attributes

奇怪的是我已经允许我的连接表genreships 和我的genre 模型以及我的movie 模型接受它们的嵌套属性但仍然没有运气。在我的movie_params 方法中必须有一些我没有做但无法找到的东西。我确实试图在此方法中允许所有可能的属性,并且完全不知道可能是什么解决方案

模型

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

电影控制器

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

表格

= 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'

类型部分

.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

类型部分

.nested-fields
  = f.input :name

以下是发布新电影后 Rails 控制台中显示的内容:

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

【问题讨论】:

  • 乍一看,这正是我在demo-project 中的做法,所以这应该可以。嗯,你能告诉我们发布到控制器的内容吗?
  • @nathanvda 更新了我的问题以显示我的控制台中发生了什么。如果还需要什么,请告诉我。

标签: ruby-on-rails forms parameters nested-forms cocoon-gem


【解决方案1】:

您使用genre_attributesgenres_attributes(复数形式)在您的控制器中定义。将其更改为:

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

【讨论】:

  • 尽管名称更改,但仍显示其未经许可
【解决方案2】:

我创建的解决方案在某种意义上与 Nathan 的示例代码有所不同,但仍然可以完成工作。只需将这条线从 genreship_fields.html.slim 移动到 _form.html.slim 就可以了:

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

我的部分现在看起来像这样:

表格

= 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'

类型部分

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

类型部分

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

【讨论】:

  • 很高兴您找到了一个可行的解决方案。我可以从您发布的参数中看出,我希望您的 strong_parameters 声明必须嵌套,但这很奇怪,因为我不需要它示例项目。我没有进一步看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-04
  • 1970-01-01
  • 1970-01-01
  • 2015-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多