4

最新情報については、大きなアップデートをお読みください。

こんにちは、みなさん、

ユーザーテーブル、興味テーブル、および評価値を持つ結合 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 を編集して更新または作成できるようになりましたが、新しいユーザーを作成しようとすると、ユーザーが空であるというエラーが表示されます。また、フォーム内の関心属性にアクセスして、ユーザーが実際に評価している関心を表示することもできません。誰でもこれらの警告を手伝ってもらえますか?

4

1 に答える 1

3

@user.interests.buildhas_many 関係であるため、必要なだけです。build_interesthas_one/belongs_to 関係がある場合に使用します。

使用fields_for :user_interestsすると、ユーザーが作成/更新されるときに、1 つ以上の user_interest オブジェクトのインスタンスがパラメーター ハッシュに含まれることを User モデルに伝えます。フォームは user_interests を作成または更新していませんが、フォームが参照するユーザーの user_interests を表す user_interest_attributes ハッシュの配列を送り返しています。これは、user_interests 評価値の配列であり、エラーが発生する理由である形式でそれらを参照すると、user_interests が存在しません。

フォームヘルパーに範囲を渡しているため、select実際には選択のためにフォームに興味を持っていません。select は、user_interests テーブルの rating 列の値を 1 ~ 10 の値で設定します。user_interests テーブルに rating 列がある場合でも、評価を設定するための user_interest は存在​​しません。

select タグの options ハッシュを渡す:multiple => trueと、複数の選択リストが作成されますが、それはあなたが望むものではないと思います。ユーザーが興味を評価できるページに多くのアイテムが必要だと思います。

ユーザーが多くの興味を選択できるようにしたい場合は、has_many :throughリレーションシップで fields_for を accept_nested_attributes_for とともに使用する方法を次に示します。

<%= form_for(@user) do |f| %>
  <% f.fields_for :interest_ids  do |interest| %>
    <ul>
      <% Interest.all.each do |choice,i| %>
      <li class="selection">
        <%= interest.check_box [], { :checked => f.object.user_interest_ids.include?(choice.id) }, choice.id, ''  %>
        <%= interest.label [], choice.name %>
      </li>
    <% end %>
    </ul>
  <% end %>
<% end %>
于 2010-09-15T04:41:39.283 に答える