为什么Rails使用params变量而不是通过函数传递参数?

时间:2014-05-02 08:10:45

标签: ruby-on-rails

正如标题所说,为什么Rails在响应动作时更喜欢在Controller动作中使用@params变量,而不是在调用函数时通过函数参数传递单个参数?

其他框架使用它(即ASP MVC),我只是想知道是否有理由进行设计决策,因为它看起来不太直观。

IE中。为什么Rails会这样做

def index
    name = params[:name]
end

而不是

def index(name)
end

2 个答案:

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