带有茧的嵌套表单:权限问题

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.