我有一个模型,其中包含一个属性,该属性是'settings'的序列化哈希。
这些设置通常是空的,这就是我不创建has_many关联的原因,但在某些情况下,用户会希望填充这些设置。它应该接受任意数量的键/值对,如下所示:
object.settings = { first_setting: 'My setting', second_setting: 'Something else' }
未定义设置数量,以及它们的值和名称。完全取决于用户。
理想情况下,我喜欢nested_form的link_to_add功能,它允许您为新设置添加一行文本字段,一个用于设置名称,另一个用于设置值。
除了我的模型中的'序列化:设置,哈希',我几乎无处可去。
非常感谢任何帮助
答案 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应用程序,它运行得很好。如果您有任何问题,请告诉我。