阅读重大更新以获取最新信息。
嘿大家,
我在 Rails 应用程序中有一个多对多关系,涉及三个表:用户表、兴趣表和连接 user_interests 表,该表也有一个评级值,以便用户可以对他们的每个兴趣进行评级1-10 级。
我基本上是在寻找一种方法,让新用户在注册时创建他们的评级,并在将来的日期同时编辑他们的评级以及他们的任何个人资料信息。
我试图遵循这个问题Rails 嵌套形式 has_many :through,如何编辑连接模型的属性?但我遇到的问题是尝试将选择列表合并到组合中,并为用户提供多种兴趣评分。
型号代码:
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
我遇到的问题是,当我想要多个利率时,参数哈希中只传递一个利率。我还收到 Rails 抛出的异常
Interest(#2172840620) expected, got Array(#2148226700)
我错过或弄错了哪些微小细节导致了问题?
EDIT:
我找到了一种强制其工作的方法,但它需要在 chrome 开发人员工具中手动编辑 HTML,我的表单元素的 :name 属性正在生成为user[user_interests_attributes][rating]
但如果我把它改成user[user_interests_attributes][][rating]
当我更新记录时它会起作用。但是,我无法手动指定绑定到表单对象的表单元素的 :name 。那么我该怎么做才能表明多个利率评级正在被通过,而不仅仅是 Rails 认为的一个呢?
大更新:
我得到了一个半功能版本,有一些细微的变化:
查看代码:
<% 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,但当我尝试创建新用户时,出现用户为空的错误。此外,我无法访问表单中的任何兴趣属性来显示用户实际评分的兴趣。任何人都可以帮助解决这些警告吗?