params.require的用例是什么?

时间:2014-11-12 01:02:01

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

我并不是真正理解params.require的目的 - 更具体地说,当缺少参数时,它可以用来引发异常。

我知道我可能希望某个请求有一些参数,但是如果缺少任何一个请求,我为什么要返回500服务器错误?为什么我不会使用条件逻辑遍历params以获取我想要的参数并返回flash[:error]

1 个答案:

答案 0 :(得分:0)

这是由于Rails使用强参数,请参阅Strong Parameters。我已经粘贴了答案底部的强参数部分

与将所有内容列入白名单并需要将参数列入黑名单的其他平台不同,Rails则相反。所有内容都被列入黑名单,您需要通过批量分配将您希望允许的参数列入白名单。

因此,如果你试图保存一个物品并且没有允许某个参数,你会看到一个"未经许可的参数:"在您的日志/控制台中。

最佳做法是通过要求允许和列入您希望允许的参数进行保存/更新操作。

强参数

使用强参数时,禁止将动作控制器参数用于活动模型批量分配,直到它们被列入白名单。这意味着您必须有意识地选择允许进行大规模更新的属性,从而防止意外暴露不应暴露的属性。

此外,参数可以根据需要进行标记,并通过预定义的加注/救援流程最终作为400 Bad Request而不费力。

class PeopleController < ActionController::Base
  # This will raise an ActiveModel::ForbiddenAttributes exception
  # because it's using mass assignment without an explicit permit
  # step.
  def create
    Person.create(params[:person])
  end

  # This will pass with flying colors as long as there's a person key
  # in the parameters, otherwise it'll raise a
  # ActionController::ParameterMissing exception, which will get
  # caught by ActionController::Base and turned into that 400 Bad
  # Request reply.
  def update
    person = current_account.people.find(params[:id])
    person.update!(person_params)
    redirect_to person
  end

  private
    # Using a private method to encapsulate the permissible parameters
    # is just a good pattern since you'll be able to reuse the same
    # permit list between create and update. Also, you can specialize
    # this method with per-user checking of permissible attributes.
    def person_params
      params.require(:person).permit(:name, :age)
    end
end