用户创建帖子并将其分配给他的一个馆藏(post belongs_to collection)
我有一个工作下拉列表,从当前用户读取collection_id,但是,我想避免用户(攻击者)传递错误的参数,例如collection_id属于不正确的用户。
我使用text_field进行了测试,并从错误的用户分配了collection_id并保存了帖子,这就是我想要阻止的。
我该怎么做?
1)在业务层内。 (我想在模型验证中)
2)在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'
形式:
<%= form_for(@post, html: { multipart: true }) do |f| %>
<%= f.hidden_field :url %>
<%= f.text_field :content %>
<%#= f.text_field :collection_id %> # This to test passing incorrect values
<%= f.collection_select :collection_id, Collection.order(:id),:id,:title, include_blank: true %>
<%= f.submit "Post", class: "btn btn-primary" %>
<% end %>
表单中的值转到post_controller #create
答案 0 :(得分:0)
假设您已经建立了用户与他/她的馆藏之间的关联,也许您可以尝试:
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)
我不完全确定这些是否是我自己最有效的方法,但我想他们应该完成你想要完成的工作。
答案 1 :(得分:0)
是的,您可以通过检查collection_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 %>