0

管理者がスプレッドシートのように特定のモデルSubmissionのすべての値を編集できるようにするためのフォームを提供しようとしています。 Submissionは、1つの文字列フィールド:domainで構成されています。動的キーの強力なパラメータを設定する

問題は、このコンテキスト内で強力なパラメータを処理する方法を理解できないということです。私はthis oneのような動的キーを扱う同様の例を見つけましたが、私はそれを私のパラメータ構造にどのように適用するかを理解できません。私はちょうどtapがどのように働くかについて十分にはっきりしていないと思う。ここで

は私のパラメータの例です:

{"3"=>{"domain"=>"domain3"}, "2"=>{"domain"=>"domain2"}, "1"=>{"domain"=>"domain1"} 

それはここで私が使用しているフォームがだ、助け場合:

<%= form_tag update_multiple_submissions_path, method: :put do %> 
    <table data-toggle="table" data-sort-name = "domain" data-sort-order = "desc"> 
     <thead> 
      <th data-field="domain" data-sortable="true">Domain</th> 
     </thead> 
     <tbody> 
      <% @submissions.each do |submission| %> 
       <%= simple_fields_for "submissions[]", submission, defaults: {label: false} do |f| %> 
        <tr> 
         <td><%= submission.domain %><%= f.input :domain %></td> 
        </tr> 
       <% end %> 
      <% end %> 
     </tbody> 
    <table> 
    <%= submit_tag "Save" %> 
<% end %> 

そして、あなたが興味が場合に、ここにupdate_multiple方法があります私のコントローラから。これが馴染んでいれば、私は鉄道から輪郭を得ました。これは強力なパラメータが遍在する前のレール3で非常に効果的でした。

def update_multiple 
    logger.debug "update_multiple #{submission_params}" 
    @submissions = Submission.update(submission_params[:submissions].keys, params[:submissions].values) 

    flash[:notice] = "Updated Submissions" 

    redirect_to review_submissions_path 
    end 

私は完全にparams.permit!を使用して、強力なベビーカーをバイパスしますが、もちろん、これは受け入れられないソリューションである場合、これは非常によく動作します。

ありがとうございました!

+0

そのペイロードに固有の必須ルールを設定する(サブミッションの配列)、または強力なパラメータにルールを動的に追加するには... – Mat

答えて

1

あなたは "仮想" モデル(テーブルなしモデル)を使用することができます:

class SubmissionFormCollection 
    include ActiveModel::Model 

    attr_accessor :submissions 
end 

def edit_multiple 
    @collection = SubmissionFormCollection.new(
    Submission.all 
) 
end 

<% simple_form_for(@collection, as: :some_param_key, path: update_multiple_submissions_path, method: :put) do |f| %> 
    <%= f.fields_for(:submissions) do |s| %> 
    <%= s.input :domain %></td> 
    <% end %> 
<% end %> 

params.require(:some_param_key) 
     .permit(submissions: [:domain]) 

私はおそらく使用することになりますがをアヤックスして実行する代わりに編集された各アイテムの一連のアトミックなPATCH要求として、直接的なユーザーのフィードバックとより良いAPIを提供します。

関連する問題