阅读最新信息的大更新。
大家好,
我的Rails应用中有一个涉及三个表的多对多关系:一个用户表、一个兴趣表和一个join user_interests表,它还有一个评分值,所以用户可以在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
我遇到的问题是,当我想要有多个兴趣评分时,只有一个兴趣评分被传递到参数哈希中。此外,我还遇到了Rails抛出的异常。
Interest(#2172840620) expected, got Array(#2148226700)
我错过或错误的微小细节导致了问题吗?
编辑:
我找到了一种强制解决此问题的方法,但需要手动编辑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
现在我可以编辑并更新我的用户兴趣,如果没有评分,则创建。但是,当我尝试创建一个新用户时,会出现“用户为空”的错误。此外,我无法访问表单中的任何兴趣属性,以显示用户实际评分的兴趣。有人能帮忙解决这些问题吗?