我正在构建一个允许用户设置一系列偏好选项的应用程序(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
目前,我想在用户上设置用户的偏好/选项&#34; show&#34;页面,所以当我提取用户的记录时,我会看到所有首选项的列表,以及每个选项的可用首选项的每个下拉列表。
我已更新用户控制器以查询首选项...
# 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
这样可行:用户&#34;显示&#34;页面我可以在使用这种语法时看到所有可用的首选项:
<p>
<H2>Preferences</H2>
<ul>
<% @prefs.each do |pref| %>
<li><%= pref.name %></li>
<ul>
</ul>
<% end %>
</ul>
</p>
但是当我添加代码以循环遍历每个&#34; prefopt&#34;对于每个pref,我都会收到错误。
<p>
<H2>Preferences</H2>
<ul>
<% @prefs.each do |pref| %>
<li><%= pref.name %></li>
<ul>
<% @pref.prefopts.each do |prefopt| %>
<li><strong>Option: </strong><%= prefopt.name %></li>
<% end %>
</ul>
<% end %>
</ul>
</p>
错误讯息:
undefined method `prefopts' for nil:NilClass
现在,我已经更新了pref scaffolding的show页面,允许我为每个首选项添加和列出prefopt记录,并且我在这里使用相同的语法。
如果我以面值看错误消息,它看起来好像是认为&#34; pref&#34;是零,但如果是这样的话,为什么在我添加prefopt之前,pref的名称是否正确显示?
我是否需要在视图中预先填充每个首选项?或者我这样做是错的?有一个我还没找到的最佳实践吗?
我已经进行了广泛的搜索,并找到了处理多对多关系的一些提示,包括:
我可以看到如何只保存可以显示的选项,如何保存一个用户记录,发送一长串嵌套属性。
我还搜索了保存用户首选项的最佳做法,而且我发现的所有示例都没有允许通过将用户首选项存储在单独的模型/表中来动态添加用户首选项。我很想为每个用户创建一个表,为每个用户和每个偏好创建一个连接表,但这不是DRY方法。如果我只能为每个首选项列出用户可用的选项,我可以看到如何保存这些嵌套属性。
感谢您的任何想法!