3

与えられたProblem&Observerモデル:

class Problem < ActiveRecord::Base
  has_many :observers
  accepts_nested_attributes_for :observers
end

class Observer < ActiveRecord::Base
  belongs_to :problem
  belongs_to :user
end

form_forユーザーをオブザーバーとして選択するために使用しようとしています:

        <%= f.fields_for :observers do |obs| %>
            <%= obs.collection_select(:user_id, Users.to_a, :id, :name, {:include_blank => true, include_hidden: false}, {:multiple => true}) %>
        <% end %> 

ただし、Rails は select:problem[observers_attributes][0][user_id][]の間違った名前を生成するため、strong_params ( {:observers_attributes => [{:user_id => []}]}) のルールを作成しても、間違った関係が作成され、問題の ID のみがデータベースに送信され、すべての user_id が無視されます。

私がやろうとしているのは、複数の選択ですべてのユーザーを表示し、ID を取得し、Problem#newメソッドでそれらの関連付けを作成することです。

アップデート 12.10

掲載パラメータ:

パラメーター:{"utf8"=>"✓", "authenticity_token"=>"NHDl/hrrFgATQOoz9A3OLbLDAbTMziKMQW9X1y2E8Ek=", "problem"=>{"problem_data_attributes"=>{"title"=>"safasfasfafsasf", "description"=>""}, "observers_attributes"=>{"0"=>{"user_id"=>["5", "8"]}}}}

強力なパラメータ:

def problem_params
 params.require(:problem).permit({:files_attributes => [:attach_id]}, {:observers_attributes => {:user_id => []}}, {:problem_data_attributes => [:title, :description]})
end

メソッドの作成

def create
 @problem         = @project.problem.build(problem_params)
 @problem.account = current_account

 if @problem.save
  render :json => {status: true, id: @problem.id}
 else
  respond_with(@problem)
 end
end

そして、作成呼び出し中にオブザーバーを作成するSQL

SQL (0.2ms)  INSERT INTO `observers` (`problem_id`) VALUES (96)
4

1 に答える 1

5

あなたがやっている方法では、複数のuser_idを持つオブザーバーのみが必要であり、実際に必要なのはユーザーごとに1つのオブザーバー(および問題)であると言っています。

おそらく次のような関連付けモデルを使用する必要があります: http://guides.rubyonrails.org/association_basics.html#the-has-and-belongs-to-many-association

ケース モデル ProblemUser とテーブル problems_users で、関連付けをアルファベット順に作成することを忘れないでください。

次に、次のようなフォームを実行できます: https://stackoverflow.com/a/9917006/1217298 – 質問と回答を読んで理解を深めてください。

それが役に立てば幸い。

于 2013-10-10T14:22:21.813 に答える