我并不是真正理解params.require
的目的 - 更具体地说,当缺少参数时,它可以用来引发异常。
我知道我可能希望某个请求有一些参数,但是如果缺少任何一个请求,我为什么要返回500服务器错误?为什么我不会使用条件逻辑遍历params以获取我想要的参数并返回flash[:error]
?
答案 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