Ruby on rails Rails 4参数验证

Ruby on rails Rails 4参数验证,ruby-on-rails,validation,ruby-on-rails-4,activerecord,Ruby On Rails,Validation,Ruby On Rails 4,Activerecord,用户创建一篇文章并将其分配给他的一个集合(文章属于集合) 我有一个从当前用户读取集合id的工作下拉列表,但是,我希望避免用户(攻击者)传递错误的参数,例如集合id属于错误的用户 我使用一个文本字段进行了测试,并从不正确的用户处分配了集合id,然后进行了后期保存,这就是我想要防止的 我该怎么做 1) 在业务层内。(我猜是内部模型验证) 2) 在db层内(某些db约束) 3) 两者都可取 注意:我需要使用上一步中的一些变量预先填写表单,然后用户可以更改或填写为空的变量 post_controller

用户创建一篇文章并将其分配给他的一个集合(文章属于集合)

我有一个从当前用户读取集合id的工作下拉列表,但是,我希望避免用户(攻击者)传递错误的参数,例如集合id属于错误的用户

我使用一个文本字段进行了测试,并从不正确的用户处分配了集合id,然后进行了后期保存,这就是我想要防止的

我该怎么做

1) 在业务层内。(我猜是内部模型验证)

2) 在db层内(某些db约束)

3) 两者都可取

注意:我需要使用上一步中的一些变量预先填写表单,然后用户可以更改或填写为空的变量

post_controller.rb:

@post = current_user.posts.build(url: @url, content: @title)

def post_params
  params.require(:post).permit(:content, :url, :collection_id)
end
型号:

collection.rb:
belongs_to :user
has_many   :posts

user.rb:
has_many :posts
has_many :collections

post.rb:
belongs_to :user
belongs_to :collection
路线:

post   'post'    => 'posts#create'
表格:


#这是为了测试是否通过了错误的值

表单中的值将转到post#controller#create

假设您已在用户和他/她的集合之间建立了关联,或许您可以尝试:

unless current_user.collections.find(params[:post][:collection_id]).blank?
    @post = current_user.posts.build(url: @url, content: @title)
end
它将检查集合是否属于用户。如果这样的集合不存在,它将返回nil

如果集合与用户关联,则可以尝试的另一件事是:

current_user.collections.find(params[:post][:collection_id]).posts.build(url: @url, content: @title)

我自己也不完全确定这些是否是最有效的方法,但我想它们应该完成您希望完成的工作。

假设您已经在用户和他/她的收藏之间建立了关联,也许您可以尝试:

unless current_user.collections.find(params[:post][:collection_id]).blank?
    @post = current_user.posts.build(url: @url, content: @title)
end
它将检查集合是否属于用户。如果这样的集合不存在,它将返回nil

如果集合与用户关联,则可以尝试的另一件事是:

current_user.collections.find(params[:post][:collection_id]).posts.build(url: @url, content: @title)

我自己也不完全确定这些是否是最有效的方法,但我想它们应该完成您希望完成的工作。

是的,您可以通过检查收集id是否属于用户来避免保存错误记录,方法如下:

unless current_user.collection_ids.include?(params[:post][:collection_id]).blank?
    @post = current_user.posts.build(post_params)
end
但我认为您应该限制使用特定于用户的集合ID来选择,例如:

<%= f.collection_select :collection_id, current_user.collections.order(:id),:id,:title, include_blank: true %>

是的,您可以通过检查
集合\u id
是否属于用户来避免保存错误记录,方法如下:

unless current_user.collection_ids.include?(params[:post][:collection_id]).blank?
    @post = current_user.posts.build(post_params)
end
但我认为您应该限制使用特定于用户的集合ID来选择,例如:

<%= f.collection_select :collection_id, current_user.collections.order(:id),:id,:title, include_blank: true %>


Where是
post_-params
,更具体地说,是控制器中使用的
collection_-select
的结果?您的collection_-select的结果转到post_-controller#createWhere是
post_-params
,更具体地说,您的
收藏的结果\u选择
正在控制器中使用?收藏的结果\u选择转到post\u控制器#创建