1

我有一个模型,其中包含一个属性,该属性是“设置”的序列化哈希。

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

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

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

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

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

任何帮助深表感谢

4

1 回答 1

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 %>

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

在视图中,我们只是简单地循环哈希keys中的所有并显示一个. 您可能想要显示其他内容,例如or 甚至. 这将需要自定义哈希以了解您要显示的设置的类型(您可以存储一个在哈希中命名的键,它保存设置的类型和一个保存设置名称的键)settingstextfieldtextareaselectsettingstypevalue

关于add_new_link功能,您可能想看看这个 railscast http://railscasts.com/episodes/196-nested-model-form-revised

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

于 2013-06-24T15:21:17.717 回答