Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 为什么Rails使用params变量而不是通过函数传递参数?_Ruby On Rails - Fatal编程技术网

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

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来自用

正如标题所说,为什么Rails在响应控制器操作时更喜欢在控制器操作内部使用@params变量,而不是在调用函数时通过函数参数传递单个参数

其他框架使用这个(即ASP MVC),我只是想知道是否有这样的设计决策的原因,因为它看起来不是很直观

为什么Rails会这样做

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