Ruby on rails 为什么Rails使用params变量而不是通过函数传递参数?
正如标题所说,为什么Rails在响应控制器操作时更喜欢在控制器操作内部使用@params变量,而不是在调用函数时通过函数参数传递单个参数 其他框架使用这个(即ASP MVC),我只是想知道是否有这样的设计决策的原因,因为它看起来不是很直观 为什么Rails会这样做Ruby on rails 为什么Rails使用params变量而不是通过函数传递参数?,ruby-on-rails,Ruby On Rails,正如标题所说,为什么Rails在响应控制器操作时更喜欢在控制器操作内部使用@params变量,而不是在调用函数时通过函数参数传递单个参数 其他框架使用这个(即ASP MVC),我只是想知道是否有这样的设计决策的原因,因为它看起来不是很直观 为什么Rails会这样做 def index name = params[:name] end 而不是 def index(name) end 关键是,控制器中的大多数操作完全处理视图。当用户与页面交互或向页面发送新的变量请求时,params来自用
def index
name = params[:name]
end
而不是
def index(name)
end
关键是,控制器中的大多数
操作
完全处理视图。当用户与页面交互或向页面发送新的变量请求时,params
来自用户的浏览器。这些请求是可变的,Rails通过在
params
hash中维护参数来实现统一。如果以下GET
请求到达:
http://localhost:3000/products?color=red&quality=best
参数
散列将自动填充为{'color'=>'red','quality'=>'best'}
。Rails不希望您的操作手动处理参数
类似地,考虑从一个用户填写表单的页面获得一个<代码>帖子请求。在该场景中,
params
获取由视图中的表单帮助程序组成的参数
虽然在催眠的情况下,您处理的是一般的方法
而不是操作
,如下面所示,您必须通过传递参数来完成
def show
if params['color'] == 'red'
@product = obtain_product('red')
else
#,..
end
end
def obtain_product(color)
Product.where('color = ?', color).first
end
希望这是清楚的。:)
@kidorrails
有一个很好的答案,我想补充一下:
如果您想将参数直接传递给每个方法,这将违反#1 Rails约定-。通过使用单独的params散列,您不仅可以访问所需的所有params,还可以根据需要通过任意多的方法访问它们
例如,以:
正如
@apreading
所提到的,params散列是在堆栈的另一部分创建的,这意味着它可以用于所有需要的方法。在我看来,这是最有效、最通用的方法,在索引方法中将所有参数键作为参数传递?就我个人而言,是的,这对我来说是最有意义的(主要是因为我习惯于使用ASP MVC f.e)。函数需要“知道”这些参数才能工作,对我来说“隐藏”这些参数的来源是没有意义的。所以你会以什么顺序提供它们?或者如果没有订单,你会使用散列?哦,如果您使用的是paramsunderstand的散列,请记住您在一个控制器中,这个类还有其他方法可以让您与堆栈交互(params、flash、request、cookies、session等等)。访问参数是堆栈的一部分,您会将会话和cookies作为参数传递给索引吗?Controller对象是特征的包装器,就像任何其他对象一样,认为PARAM传递的请求与其他对象的请求可能有很大的不同。这可能是有趣的,如果方法可以重载,像在C++(几个方法具有相同的名称与不同的参数);但是在ruby中,声明的痛苦比其他任何事情都要多,您可能总是会得到类似defmy_action(*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