带有茧的嵌套表单:权限问题
Nested forms with cocoon: permission issue
我有一个嵌套的 simple_form,我使用 gem 茧。我有一个挑战模型,在 challenge.rb 中有这个:accepts_nested_attributes_for :prizes
以及一项挑战 has_many
奖品。提交表单时,出现错误:
Unpermitted params: prizes
即使我在强参数中授权了它。我以前用过 cocoon 并设法让它工作,我在这里找不到问题,我正在扯掉我的头发。
在我的challenges_controller.rb中:
def create
@challenge = Challenge.create(challenge_params)
@challenge.user = current_user
authorize @challenge
if params["challenge"]["prizes_attributes"]
for k,v in params["challenge"]["prizes_attributes"]
@prize = Prize.create
@prize.challenge = @challenge
@prize.title = v.values[0].values[0]
@prize.save
end
end
if @challenge.save
redirect_to challenge_path(@challenge)
else
render :new
end
end
def challenge_params
params.require(:challenge).permit(:title,
:banner,
:user,
:start_date,
:end_date,
:tagline,
:slug,
:rules,
:category_id,
:organization,
prizes_attributes: [:id, :title])
end
此外,以我的形式创建一个挑战:
<%= simple_form_for @challenge do |f| %>
<%= f.error_notification %>
<div class="form-inputs">
<%= f.input :title, :label => "Titre" %>
<%= f.input :banner, :label => "Bannière", as: :attachinary %>
<%= f.input :tagline, :label => "Tagline" %>
<%= f.input :organization, :collection => @organizations,:label => "Organization", :include_blank => true%>
<%= f.input :rules, :label => "Lien vers le règlement" %>
<%= f.input :start_date, as: :string, input_html: {type: :date}, :label => "Date de début" %>
<%= f.input :end_date, as: :string, input_html: {type: :date}, :label => "Date de fin" %>
<%= f.input :category_id, :collection => @ancestors,:label => "Catégorie", :include_blank => true%>
<%= f.simple_fields_for :prizes do |p| %>
<%= render 'prize_fields', f: p %>
<% end %>
<%= link_to_add_association 'Ajouter un prix', f, :prizes %>
</div>
<div class="form-actions text-center">
<%= f.button :submit, "Soumettre", :class => "btn btn-primary" %>
</div>
<% end %>
在我的 prizes_fields 部分中:
<li>
<div class='row'>
<%= f.fields_for :prizes do |p| %>
<div class='col-xs-12 col-md-6'>
<div class="materiel-wrapper">
<%= p.text_field :title, class:"form-control", placeholder:"Titre" %>
</div>
</div>
<% end %>
</div>
</li>
有人看到我哪里出错了吗?
感谢您的宝贵时间和帮助
@challenge = Challenge.create(challenge_params)
这会将嵌套的奖品参数传递给您的作品,您无需手动解析它们。
Create
将尝试保存记录,因为您正在更改对象并稍后保存它,您可能需要在此处使用 .new
而不是创建。
您的表单正在复制 fields_for
调用,这可能会导致错误的参数通过。
您的视图中有 f.simple_fields_for :prizes do |p|
,因此部分不需要它。将其从部分中取出并将部分更改为使用 f.text_field
而不是 p.
我有一个嵌套的 simple_form,我使用 gem 茧。我有一个挑战模型,在 challenge.rb 中有这个:accepts_nested_attributes_for :prizes
以及一项挑战 has_many
奖品。提交表单时,出现错误:
Unpermitted params: prizes
即使我在强参数中授权了它。我以前用过 cocoon 并设法让它工作,我在这里找不到问题,我正在扯掉我的头发。
在我的challenges_controller.rb中:
def create
@challenge = Challenge.create(challenge_params)
@challenge.user = current_user
authorize @challenge
if params["challenge"]["prizes_attributes"]
for k,v in params["challenge"]["prizes_attributes"]
@prize = Prize.create
@prize.challenge = @challenge
@prize.title = v.values[0].values[0]
@prize.save
end
end
if @challenge.save
redirect_to challenge_path(@challenge)
else
render :new
end
end
def challenge_params
params.require(:challenge).permit(:title,
:banner,
:user,
:start_date,
:end_date,
:tagline,
:slug,
:rules,
:category_id,
:organization,
prizes_attributes: [:id, :title])
end
此外,以我的形式创建一个挑战:
<%= simple_form_for @challenge do |f| %>
<%= f.error_notification %>
<div class="form-inputs">
<%= f.input :title, :label => "Titre" %>
<%= f.input :banner, :label => "Bannière", as: :attachinary %>
<%= f.input :tagline, :label => "Tagline" %>
<%= f.input :organization, :collection => @organizations,:label => "Organization", :include_blank => true%>
<%= f.input :rules, :label => "Lien vers le règlement" %>
<%= f.input :start_date, as: :string, input_html: {type: :date}, :label => "Date de début" %>
<%= f.input :end_date, as: :string, input_html: {type: :date}, :label => "Date de fin" %>
<%= f.input :category_id, :collection => @ancestors,:label => "Catégorie", :include_blank => true%>
<%= f.simple_fields_for :prizes do |p| %>
<%= render 'prize_fields', f: p %>
<% end %>
<%= link_to_add_association 'Ajouter un prix', f, :prizes %>
</div>
<div class="form-actions text-center">
<%= f.button :submit, "Soumettre", :class => "btn btn-primary" %>
</div>
<% end %>
在我的 prizes_fields 部分中:
<li>
<div class='row'>
<%= f.fields_for :prizes do |p| %>
<div class='col-xs-12 col-md-6'>
<div class="materiel-wrapper">
<%= p.text_field :title, class:"form-control", placeholder:"Titre" %>
</div>
</div>
<% end %>
</div>
</li>
有人看到我哪里出错了吗?
感谢您的宝贵时间和帮助
@challenge = Challenge.create(challenge_params)
这会将嵌套的奖品参数传递给您的作品,您无需手动解析它们。
Create
将尝试保存记录,因为您正在更改对象并稍后保存它,您可能需要在此处使用 .new
而不是创建。
您的表单正在复制 fields_for
调用,这可能会导致错误的参数通过。
您的视图中有 f.simple_fields_for :prizes do |p|
,因此部分不需要它。将其从部分中取出并将部分更改为使用 f.text_field
而不是 p.