好的,这是我尝试过的,效果很好。
用户模型 - 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 甚至. 这将需要自定义哈希以了解您要显示的设置的类型(您可以存储一个在哈希中命名的键,它保存设置的类型和一个保存设置名称的键)settings
textfield
textarea
select
settings
type
value
关于add_new_link
功能,您可能想看看这个 railscast http://railscasts.com/episodes/196-nested-model-form-revised
我从头开始启动了一个 Rails 应用程序,它运行良好。如果您有任何问题,请告诉我。