最新情報については、大きなアップデートをお読みください。
こんにちは、みなさん、
ユーザーテーブル、興味テーブル、および評価値を持つ結合 user_interests テーブルの 3 つのテーブルを含む Rails アプリに多対多の関係があります。 1-10 スケール。
私は基本的に、新しいユーザーがサインアップするときに評価を作成し、将来の日付でプロファイル情報と同時に評価を編集する方法を探しています.
この質問に従ってみましたRails nested form with has_many :through, how to edit attributes of join model? しかし、私が抱えている問題は、選択リストをミックスに組み込み、ユーザーを評価するために複数の興味を持っていることです。
モデルコード:
user.rb
has_many :user_interests, :dependent => :destroy
has_many :interests, :through => :user_interests, :foreign_key => :user_id
accepts_nested_attributes_for :user_interests
interest.rb
has_many :user_interests, :dependent => :destroy
has_many :users, :through => :user_interests, :foreign_key => :interest_id, :dependent => :destroy
user_interest.rb
belongs_to :user
belongs_to :interest
コードを表示:
app/views/user/_form.html.erb
<%= form_for(@user) do |form| %>
... user fields
<%= form.fields_for :user_interests do |ui_form| %>
... loop through ALL interests
<% Interest.all.each do |interest| %>
<%= ui_form.select :rating, options_for_select(1..10) %>
<%= ui_form.hidden_field :interest_id, :value => interest.id %>
<% end %>
<% end %>
<% end %>
また、コントローラーの新規/編集アクションに以下を含めました@user.interests.build.build_interest
私が直面している問題は、複数の関心度が必要な場合に、params ハッシュで渡される関心度が 1 つだけであることです。また、レールによってスローされた例外が発生しています
Interest(#2172840620) expected, got Array(#2148226700)
問題の原因となっている、見逃した、または間違った細部は何ですか?
編集:
これを強制的に機能させる方法を見つけましたが、クロム開発者ツールで HTML を手動で編集する必要があります。フォーム要素の :name 属性が生成されてuser[user_interests_attributes][rating]
いますが、それを変更するとuser[user_interests_attributes][][rating]
、レコードを更新したときに機能します。ただし、フォーム オブジェクトに関連付けられているフォーム要素の :name を手動で指定することはできません。では、Rails が考える 1 つだけではなく、複数の利率が渡されていることを示すにはどうすればよいでしょうか?
ビッグアップデート:
少し変更を加えた半機能バージョンを作成しました。
コードを表示:
<% form.fields_for :user_interests do |ui_form| %>
<p>
<%= ui_form.select :rating, options_for_select(1..5), :selected => :rating %>
<%= ui_form.label :interest_title %>
<%= ui_form.hidden_field :interest_id %>
</p>
<% end %>
コントローラーコード:
def new
@user = User.new
Interest.all.each { |int| @user.user_interests.build({ :interest_id => int.id }) }
end
def edit
@user = @current_user
Interest.unrated_by_user_id(@user.id).each { |int| @user.user_interests.build({ :interest_id => int.id }) }
end
これで、評価が存在しない場合に user_interests を編集して更新または作成できるようになりましたが、新しいユーザーを作成しようとすると、ユーザーが空であるというエラーが表示されます。また、フォーム内の関心属性にアクセスして、ユーザーが実際に評価している関心を表示することもできません。誰でもこれらの警告を手伝ってもらえますか?