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