我正在构建一个允许用户设置一系列首选项选项的应用程序(web / iOS)。所需的模型/表格包括:
型号规格:
class User < ActiveRecord::Base
has_many :user_prefs
has_many :prefopts, through: :user_prefs
end
class Pref < ActiveRecord::Base
has_many :prefopts
has_many :user_prefs
accepts_nested_attributes_for :prefopts
validates :name, presence: true
end
class Prefopt < ActiveRecord::Base
belongs_to :pref
has_many :user_prefs
has_many :users, through: :user_prefs
accepts_nested_attributes_for :user_prefs
end
class UserPref < ActiveRecord::Base
belongs_to :user
belongs_to :prefopt
end
现在,我想在用户“show”页面上设置用户的偏好/选项,所以当我拉出用户的记录时,我会看到所有偏好的列表,并且每个下拉列表都会显示每个选项的可用偏好。
我已更新用户控制器以查询首选项...
# GET /users/1
# GET /users/1.json
def show
@prefs = Pref.all
end
另外,我在用户下添加了路径文件引用:
resources :users do
resources :prefs do
get 'prefopts', on: :member
end
end
这很好用:在用户的“show”页面上,我可以在使用这种语法时看到所有可用的首选项:
<p>
<H2>Preferences</H2>
<ul>
<% @prefs.each do |pref| %>
<li><%= pref.name %></li>
<ul>
</ul>
<% end %>
</ul>
</p>
现在,我想创建一系列复选框,每个选项都有可用的选项。从其他例子来看,我把它放在一起:
<%= form_for(@user) do |f| %>
<%= f.hidden_field :user_id, :value => @user.id %>
<H2>Preferences</H2>
<ul>
<% @prefs.each do |pref| %>
<li><%= pref.name %></li>
<%= f.fields_for :user_prefs, @user.user_prefs.find_or_initialize_by(pref_id: pref.id) do |u| -%>
<%= u.hidden_field :pref_id, pref.id %>
<%= u.collection_check_boxes(:user_pref, :pref_opt_ids, pref.prefopts, :id, :name) %>
<% end -%>
<% end %>
</ul>
</p>
我得到的错误与find_or_initialize_by一致,是:未定义方法`merge'为1:Fixnum
我非常感谢你能给我的任何帮助!