Ruby on rails 在RubyonRails中使用规范化模型设置用户首选项
我正在构建一个应用程序(web/iOS),允许用户设置一系列偏好选项。所需的型号/表格包括:Ruby on rails 在RubyonRails中使用规范化模型设置用户首选项,ruby-on-rails,Ruby On Rails,我正在构建一个应用程序(web/iOS),允许用户设置一系列偏好选项。所需的型号/表格包括: 用户:存储用户名、密码、电子邮件地址 首选项:存储可用首选项的名称/类别,即“性别” PrefOpts:存储每个偏好的选项,即性别的“男性”和“女性” UserPrefs:为每个Pref的每个用户存储选定的PrefOpt 型号规格: class User < ActiveRecord::Base has_many :user_prefs has_many :prefopts, thro
- 用户:存储用户名、密码、电子邮件地址
- 首选项:存储可用首选项的名称/类别,即“性别”
- PrefOpts:存储每个偏好的选项,即性别的“男性”和“女性”
- UserPrefs:为每个Pref的每个用户存储选定的PrefOpt
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
此外,我还在“用户”下的“路由”文件引用中添加了:
resources :users do
resources :prefs do
get 'prefopts', on: :member
end
end
这很好:在用户的“显示”页面上,使用以下语法时,我可以看到所有可用的首选项:
<p>
<H2>Preferences</H2>
<ul>
<% @prefs.each do |pref| %>
<li><%= pref.name %></li>
<ul>
</ul>
<% end %>
</ul>
</p>
现在,我已经更新了pref scaffolding的show页面,允许我为每个首选项添加和列出prefopt记录,并且我在这里使用了与该视图相同的语法
如果我从表面上看错误消息,它看起来好像认为“pref”为零,但如果是这样,为什么在我添加prefopt之前pref的名称显示正确
在视图中是否需要执行某些操作来预填充每个pref的选项?还是我完全错了?有没有我还没有找到的最佳实践
我进行了广泛的搜索,找到了一些处理多对多关系的技巧,包括:
我可以看到如何保存一条发送一长串嵌套属性的用户记录,只要我能够获得显示的选项
我还搜索了保存用户首选项的最佳实践,我发现没有一个示例允许将来通过将用户首选项存储在单独的模型/表中来灵活地动态添加用户首选项。我试图简单地为每个首选项创建一个表,为每个用户和每个首选项创建一个联接表,但这不是一种枯燥的方法。如果我只能为每个首选项列出用户可用的选项,我可以看到如何保存这些嵌套属性
谢谢你的任何想法 您收到的错误消息是因为未设置@pref。 按如下方式重写您的视图:
<% @prefs.each do |pref| %>
<li>
<%= pref.name %>
<ul>
<% pref.prefopts.each do |prefopt| %>
<li><strong>Option: </strong><%= prefopt.name %></li>
<% end %>
</ul>
</li>
<% end %>
- 选项:
(注意,我删除了第5行
pref
之前的@符号)因此,这里的教训是,因为我在控制器中实例化了@prefs,它是一个实例变量,一个包含pref对象的数组,但当我循环其内容时,每个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
<% @prefs.each do |pref| %>
<li>
<%= pref.name %>
<ul>
<% pref.prefopts.each do |prefopt| %>
<li><strong>Option: </strong><%= prefopt.name %></li>
<% end %>
</ul>
</li>
<% end %>