序列化哈希允许任意键/值对

时间:2013-06-24 13:47:05

标签: ruby-on-rails

我有一个模型,其中包含一个属性,该属性是'settings'的序列化哈希。

这些设置通常是空的,这就是我不创建has_many关联的原因,但在某些情况下,用户会希望填充这些设置。它应该接受任意数量的键/值对,如下所示:

object.settings = { first_setting: 'My setting', second_setting: 'Something else' }

未定义设置数量,以及它们的值和名称。完全取决于用户。

理想情况下,我喜欢nested_form的link_to_add功能,它允许您为新设置添加一行文本字段,一个用于设置名称,另一个用于设置值。

除了我的模型中的'序列化:设置,哈希',我几乎无处可去。

非常感谢任何帮助

1 个答案:

答案 0 :(得分:1)

好的,这是我尝试的,它运作得很好。

用户模型 - models / user.rb

class User < ActiveRecord::Base
  serialize :settings

  attr_accessible :email, :settings_attributes

  def settings_attributes=(attributes)
    self.settings = attributes
  end
end

用户控制器 - controllers / users_controller.rb

class UsersController < ApplicationController
  def index
    @users = User.all
  end

  def show
    @user = User.find(params[:id])
  end

  def edit
    @user = User.find(params[:id])
  end

  def update
    @user = User.find(params[:id])
    if @user.update_attributes(params[:user])
      redirect_to users_path
    else
      render :new
    end
  end
end

用户编辑页面 - views / users / edit.html.erb

<h1>Users#edit</h1>

<%= form_for @user do |f| %>

  <%= f.fields_for :settings_attributes, OpenStruct.new(@user.settings) do |builder| %>

    <% @user.settings.keys.each do |key| %>

      <%= builder.text_field key.to_sym %><br />

    <% end %>

  <% end %>

  <%= f.submit %>

<% end %>

更新用户时,控制器在params哈希中接收名为settings_attributes的密钥。通过在User模型中定义setter,我们可以编辑序列化的settings属性。

在视图中,我们只是循环keys哈希中的所有settings并显示textfield。您可能希望显示其他内容,例如textarea甚至select。这需要自定义settings哈希,以便知道要显示的设置的类型(您可以在哈希中存储名为type的密钥,该密钥包含设置的类型,密钥value,其中包含设置的名称)

关于add_new_link功能,您可能需要查看此railscast http://railscasts.com/episodes/196-nested-model-form-revised

我从头开始启动了一个rails应用程序,它运行得很好。如果您有任何问题,请告诉我。