正如标题所说,为什么Rails在响应动作时更喜欢在Controller动作中使用@params变量,而不是在调用函数时通过函数参数传递单个参数?
其他框架使用它(即ASP MVC),我只是想知道是否有理由进行设计决策,因为它看起来不太直观。
IE中。为什么Rails会这样做
def index
name = params[:name]
end
而不是
def index(name)
end
答案 0 :(得分:1)
关键是,控制器中的大多数actions
处理视图 REST -fully。当params
与页面交互或向页面发送新的变量请求时,params
来自用户的浏览器。
这些请求是可变的,Rails通过维护GET
哈希中的参数使其统一。如果以下http://localhost:3000/products?color=red&quality=best
请求到达:
params
{'color' => 'red', 'quality' => 'best'}
哈希将自动填充为POST
。 Rails不希望您的操作手动处理参数。
同样,请考虑您从用户填写表单的页面收到params
请求。在这种情况下,methods
获取在视图内部由表单助手组成的参数。
虽然在假设的情况下,你正在处理一般actions
而不是def show
if params['color'] == 'red'
@product = obtain_product('red')
else
#,..
end
end
def obtain_product(color)
Product.where('color = ?', color).first
end
,如下所示,你将通过传递参数来做到这一点。
{{1}}
希望很清楚。 :)
答案 1 :(得分:1)
@kidorrails
有一个很好的答案,我想补充一点:
如果你想直接将params传递给每个方法,那么它将违反#1 Rails惯例 - keep it DRY。通过使用单独的params哈希,您不仅可以访问所有所需的参数,而且可以通过所需的多种方法访问它们
例如,选择strong_params
:
#controller
def new
@model = Model.new
end
def create
@model = Model.new(strong_params)
@model.save
end
private
def strong_params
params.require(:model).permit(:your, :params)
end
正如@apneadiving
所提到的,params散列是在堆栈的另一部分中创建的,这意味着它可用于所需的所有方法。它效率最高&多方面的做法IMO