Serialization Rails 3-从序列化数据构建表单
我一直在从事一个rails项目,我需要序列化用户角色的权限并存储在数据库中。就这一点而言,我很好。现在,当我想修改rails生成的表单中的序列化数据时,我的问题来了 我凭直觉行事,试着做出预期的行为。 这将是使用如下内容:Serialization Rails 3-从序列化数据构建表单,serialization,ruby-on-rails-3.1,Serialization,Ruby On Rails 3.1,我一直在从事一个rails项目,我需要序列化用户角色的权限并存储在数据库中。就这一点而言,我很好。现在,当我想修改rails生成的表单中的序列化数据时,我的问题来了 我凭直觉行事,试着做出预期的行为。 这将是使用如下内容: f.check_box :permissions_customer_club_events_read class User::Affiliation::Role < ActiveRecord::Base attr_bucket :permissions =>
f.check_box :permissions_customer_club_events_read
class User::Affiliation::Role < ActiveRecord::Base
attr_bucket :permissions => [:permissions_customer_club_events_read, :permissions_customer_club_events_write, :permission_do_crazy_things]
after_initialize :init
def init
## Sets base permission structure ##
self.permissions ||= YAML.load_file("#{Rails.root}/config/permissions.yml")
end
end
但是,由于不存在用于序列化数据的getter或setter,因此这不起作用(显然是:p)。现在我想知道我将如何着手解决这个问题,我唯一想到的是从我的序列化哈希动态生成getter和setter方法
例如:
def permissions_customer_club_events_read=(val)
permissions[:customer][:club][:events][:read] = val
end
def permissions_customer_club_events_read
permissions[:customer][:club][:events][:read]
end
有人明白我的意思吗
这是我的型号:
class User::Affiliation::Role < ActiveRecord::Base
require 'yajl'
class YajlCoder
def dump data
Yajl.dump data
end
def load data
return unless data
Yajl.load data
end
end
serialize :permissions, YajlCoder.new
after_initialize :init
def init
## Sets base permission structure ##
self.permissions ||= YAML.load_file("#{Rails.root}/config/permissions.yml")
end
end
class User::Affiliation::Role
我建议你看看类似的东西。表面上,这可以用来解决一些继承烦恼,但它也可以为您解决问题。这就是本质
看起来您知道所有权限是什么,但希望将所有权限序列化到同一数据库字段中。但在实际的rails应用程序中,您希望将所有权限视为完全独立的字段。这正是像attr\u bucket
这样的解决方案可以让您做到的。让我们以您为例,您可以这样做:
f.check_box :permissions_customer_club_events_read
class User::Affiliation::Role < ActiveRecord::Base
attr_bucket :permissions => [:permissions_customer_club_events_read, :permissions_customer_club_events_write, :permission_do_crazy_things]
after_initialize :init
def init
## Sets base permission structure ##
self.permissions ||= YAML.load_file("#{Rails.root}/config/permissions.yml")
end
end
class User::Affiliation::Role[:permissions\u customer\u club\u events\u read、:permissions\u customer\u club\u events\u write、:permissions\u do\u疯狂的事情]
初始化后:初始化
def初始化
##设置基本权限结构##
self.permissions | |=YAML.load_文件(“#{Rails.root}/config/permissions.yml”)
结束
结束
现在,您可以像使用单独的数据库字段一样使用权限\u客户\u俱乐部\u事件\u读取
,权限\u客户\u俱乐部\u事件\u写入
,权限\u做疯狂的事情
,但是,当您实际保存对象时,所有这些字段都会“扣”在一起,并序列化到:permissions
字段中
唯一需要注意的是序列化机制,我相信
attr_bucket
将使用YAML序列化所有内容,而您使用的是JSON。如果这不重要,那么你就是黄金,否则你可能需要修补attr_bucket
以使用json而不是YAML,这应该是非常直接的。如果我不理解这个问题,很抱歉;)
您可以在模型中包含一个customdata模块,并使用以下方法:
module CustomData
def self.included(base)
base.instance_eval do
after_save :save_data
end
def method_missing(method, *args, &block)
if method.to_s =~ /^data_/
data[method] ? data[method] : nil
else
super
end
end
def data
@data ||= begin
#get and return your data
end
end
private
def save_data
end
end
使用此方法,您必须使用f。复选框:数据\u权限\u客户\u俱乐部\u事件\u读取
这并不完全,但我希望你能理解;)
attr_bucket似乎也是一个很好的解决方案。最终我解决了这个问题,我就是这样解决的。
现在为所有序列化字段生成getter和setter方法