【问题标题】:Rails: Strong parameters, Does it have to be present all the time?Rails:强参数,它必须一直存在吗?
【发布时间】:2016-07-11 22:10:06
【问题描述】:

正如标题所说。我知道强参数是为了防止在更新或创建新对象时包含其他未经授权的属性。我见过没有强参数的代码。比如Hartl的教程relationships controller:

class RelationshipsController < ApplicationController
  before_action :logged_in_user

  def create
    @user = User.find(params[:followed_id])
    current_user.follow(@user)
    respond_to do |format|
      format.html { redirect_to @user }
      format.js
    end
  end

  def destroy
    @user = Relationship.find(params[:id]).followed
    current_user.unfollow(@user)
    respond_to do |format|
      format.html { redirect_to @user }
      format.js
    end
  end
end  

还有其他的,比如创建新帖子或用户等。所以我的问题是,什么时候使用强参数?

【问题讨论】:

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


    【解决方案1】:

    在批量赋值时使用强参数是理想的。就像创建新帖子或用户一样。它可能允许攻击者设置任何数据库列的值。

    查看 Rails 官方 guide 了解它。

    只要你知道并提到模型属性,这样做就可以了。

    @user = User.find(params[:followed_id])
    @user = Relationship.find(params[:id]).followed
    

    【讨论】:

    • 您的链接是 rails 3.2 指南
    【解决方案2】:

    我想说 - 对使用批量分配的任何操作都使用强参数。这意味着,create 或 update 之类的操作必须使用强参数。

    例如,而不是:

    @object.update_attributes(params[:object])
    

    只要有一个:

    @object.update_attributes(object_params)
    

    这将为您将参数列入白名单。此外,它还允许您为不同的操作传递不同的参数,使用 object_update_params 和 object_create_params 等方法,它们将分别将更新参数和创建参数列入白名单。

    【讨论】:

      【解决方案3】:

      是的,不使用强参数会引发ActiveModel::ForbiddenAttributesError,因此除非您设法覆盖此行为,否则它不是可选的。

      在上面的示例中,他只是检索一条记录,然后在模型中创建与该 id 的关系。

      def follow!(other_user)
        relationships.create!(followed_id: other_user.id)
      end
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多