Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在RubyonRails中使用规范化模型设置用户首选项_Ruby On Rails - Fatal编程技术网

Ruby on rails 在RubyonRails中使用规范化模型设置用户首选项

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

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

  • 用户:存储用户名、密码、电子邮件地址
  • 首选项:存储可用首选项的名称/类别,即“性别”
  • 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 %>