我一直在阅读有关铁路安全问题的内容,而让我最关心的是群发分配。我的应用程序正在使用attr_accessible,但是我不确定我是否完全知道处理暴露关系的最佳方法是什么。假设我们有一个基本的内容创建/所有权网站。用户可以创建博客帖子,并且有一个类别与该博客帖子相关联。
所以我有三种模式:
我允许在category_id上进行批量分配,因此用户可以将其删除,将其更改为其中一个类别,或通过批量分配,我认为他们可以将其更改为其他人的类别。这就是我不确定最好的方法是什么。
我调查过的资源(特别是railscast #178和从{railcast提供的resource)都提到了这种关联不应该是可以大规模分配的,这是有道理的。我只是不确定如何让用户更改帖子的类别会有多么困难。
关于如何最好地解决这个问题的任何想法?我看错了吗?
更新:希望更多地澄清我的担忧。
假设我在Post,我是否需要以下内容:
def create
@post = Post.new(params[:category])
@post.user_id = current_user.id
# CHECK HERE IF REQUESTED CATEGORY_ID IS OWNED BY USER
# continue on as normal here
end
这似乎很多工作?我需要在更新和创建操作中检查每个控制器上的内容。请记住,不仅有一个belongs_to关系。
答案 0 :(得分:5)
您的用户可以通过某种编辑形式进行更改,我猜想。
基于此,Mass Assignment真的适用于那些试图通过卷曲之类的东西搞乱你的应用程序的邪恶类型。我称他们为卷发小子。
所有这一切,如果你使用attr_protected
- (这里你放置了你不希望它们改变的字段)或孩子最喜欢的attr_accessible
(可以改变的字段)。
你会听到两者的争论,但是如果你在模型中使用attr_protected :user_id
,然后在你的CategoryController #create动作中你可以做类似的事情
def create
@category = Category.new(params[:category])
@category.user_id = current_user.id
respond_to do |format|
....#continue on as normal here
end
答案 1 :(得分:0)
好的,所以搜索了一下,最后想出了一些适合我的东西。我喜欢在可能的情况下将逻辑从控制器中删除,因此该解决方案是基于模型的解决方案:
# Post.rb
validates_each :asset_category_id do |record, attr, value|
self.validates_associated_permission(record, attr, value)
end
# This can obviously be put in a base class/utility class of some sort.
def self.validates_associated_permission(record, attr, value)
return if value.blank?
class_string = attr.to_s.gsub(/_id$/, '')
klass = class_string.camelize.constantize
# Check here that the associated record is the users
# I'm leaving this part as pseudo code as everyone's auth code is
# unique.
if klass.find_by_id(value).can_write(current_user)
record.errors.add attr, 'cannot be found.'
end
end
我还发现rails 3.0有更好的方法来指定它,而不是超通用validates_each所需的3行。
http://ryandaigle.com/articles/2009/8/11/what-s-new-in-edge-rails-independent-model-validators