Rails 4 params验证

时间:2016-04-19 04:52:03

标签: ruby-on-rails validation ruby-on-rails-4 activerecord

用户创建帖子并将其分配给他的一个馆藏(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

2 个答案:

答案 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 %>