使用hstore并为用户保存新值

时间:2015-08-17 18:45:06

标签: ruby-on-rails-4 hstore

我的用户模型包含以下内容的值:

姓名,电子邮件,电话,已批准等。

我正在处理的项目范围包括自定义用户设置,因此我使用的是hstore(我不想创建user_settings表)。

在用户编辑视图中,我想创建一个名为' colors'的复选框。以及是否选中该复选框确定是否为用户设置了该设置。

我已按如下方式设置hstore:

class AddHstore < ActiveRecord::Migration
  def up
    enable_extension :hstore
  end

  def down
    disable_extension :hstore
  end
end

并按如下方式更新了用户模型:

class AddSettingsToUser < ActiveRecord::Migration
  def up
    add_column :users, :settings, :hstore
  end

  def down
    remove_column :users, :settings
  end
end

这实际上是我的用户编辑视图:

<%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put, :class => "form-horizontal user" }) do |f| %>
  <%= devise_error_messages! %>

      <div class="field">
        <%= f.label :name %><br />
        <%= f.text_field :name, autofocus: true %>
      </div>

      <div class="field">
        <%= f.label :email %><br />
        <%= f.email_field :email %>
      </div>

      <div class="field">
        <%= f.label :phone_number %><br />
        <%= f.text_field :phone_number %>
      </div>

      <div class="actions">
        <%= f.submit 'Update', :class => 'btn btn-primary' %>
      </div>

<% end %>

此时我不确定如何实际实现此功能。用户编辑页面允许用户更改其姓名,电话和其他值,但我如何为hstore settings添加新值?

1 个答案:

答案 0 :(得分:3)

在您创建用户的form_for内,添加如下所示的hstore文件:

<%= form_for resource, ...do |f| %>
  #...
  <%= f.fields_for :settings do |settings| %>
    <%= settings.text_field :field1 %>
    <%= settings.text_field :field2 %>
  <% end %>
  #....
<% end %>

然后更新您的控制器强参数方法,如下所示,以允许这些新字段。:

  def user_params
       params.require(:user)
             .permit(
                      :name,
                      :email,
                      settings: [ :field1, :field2 ]
                    )
  end

现在,你已经完成了。打开rails控制台并尝试一些示例数据,如

User.create(
            settings: { field1: 'data1', field2: 'data2' }
           )