在Ruby On Rails中使用规范化模型设置用户首选项

时间:2015-02-16 18:42:13

标签: ruby-on-rails

我正在构建一个允许用户设置一系列偏好选项的应用程序(web / iOS)。所需的模型/表格包括:

  • 用户:存储用户名,密码,电子邮件地址
  • Prefs:存储可用偏好的名称/类别,即" sex"
  • 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

目前,我想在用户上设置用户的偏好/选项&#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的名称是否正确显示?

我是否需要在视图中预先填充每个首选项?或者我这样做是错的?有一个我还没找到的最佳实践吗?

我已经进行了广泛的搜索,并找到了处理多对多关系的一些提示,包括:

http://www.createdbypete.com/articles/working-with-nested-forms-and-a-many-to-many-association-in-rails-4/

我可以看到如何只保存可以显示的选项,如何保存一个用户记录,发送一长串嵌套属性。

我还搜索了保存用户首选项的最佳做法,而且我发现的所有示例都没有允许通过将用户首选项存储在单独的模型/表中来动态添加用户首选项。我很想为每个用户创建一个表,为每个用户和每个偏好创建一个连接表,但这不是DRY方法。如果我只能为每个首选项列出用户可用的选项,我可以看到如何保存这些嵌套属性。

感谢您的任何想法!

0 个答案:

没有答案