什么使 rails 参数?
What makes a rails param?
到目前为止,我已经建立了几个 rails 站点(使用起来非常愉快),但我逐渐注意到我的 monkey-see-monkey-do 学习强参数的方法显然留下了在我的理解中存在一两个差距。
下面看一个简单的例子(Recipe Box by mackenziechild)
def recipe_params
params.require(:recipe).permit(:title, :description, :image, ingredients_attributes: [:id, :name, :_destroy], directions_attributes: [:id, :step, :_destroy])
end
我真的不知道他为什么能够引用 :recipe
作为参数。我对参数的粗略理解是它们本质上是 table 中的列,但是上面的示例暗示它们也可以是 table 本身的名称。 (没有列命名为 "recipe",尽管其中一个 table 被命名为 "recipes")。
当我生成模型 MyThing
(单数 CamelCase)并因此生成相应的 table、my_things
(复数 snake_case)时,我的理解是否正确? , 我自动有一个相应的参数 :my_thing
(带冒号的单数 snake_case)供我使用?
我的问题如下:
- 以上理解准确吗?
- 除了 table 名称和列名之外,还有其他参数对应吗?如果有,它们是什么?
- 有没有办法列出我可以使用的参数(类似于
rake routes
)?
非常感谢您提供的任何说明!
控制器中可用的 params
仅仅是浏览器中表单中字段名称的结果。表单中字段的名称遵循 Rails 使用您在视图中使用的表单辅助函数创建的约定。
当您在视图中看到此内容时:
= form_for @recipe do |f|
= f.text_field :title
然后将生成以下内容 HTML:
<form stuff-here>
<input name="recipe[title]" other-stuff>
并且 HTML 中的 name
属性将导致该字段的值在您的控制器中公开为 params[:recipe][:title]
那是 其中params 来自,如果您更改其中的任何部分,那么 params
的名称将会不同。
所以对于你的问题:
- 有点,你得出了正确的结论,但也许不知道为什么:)
- 您可以使用任何您喜欢的
params
,这取决于您使用的表单助手以及您如何使用它们。一切都可以被覆盖。
- 您始终可以在您的控制器中执行:
logger.debug params.inspect
,这样您就可以看到(在您的 log/development.log
文件中)有哪些 params
供您使用。
params
散列基本上是浏览器(或API 客户端)发送的数据。它们没有在任何地方定义,因为浏览器可以向您发送任何它想要的东西(尝试在您的应用程序中将 &foo=bar 添加到 URL 的末尾,看看这如何向参数添加条目),尽管通常您应用程序可能希望数据具有某种形状。
对自己的参数意义不大;重要的是如何使用它们。如果将它们传递给 SomeModel.create
,那么键应该是模型中属性的名称(并且您应该使用强参数来控制可以设置的属性)。这只是它们的一种(尽管经常)使用:例如,它们可能包含搜索条件。
到目前为止,我已经建立了几个 rails 站点(使用起来非常愉快),但我逐渐注意到我的 monkey-see-monkey-do 学习强参数的方法显然留下了在我的理解中存在一两个差距。
下面看一个简单的例子(Recipe Box by mackenziechild)
def recipe_params
params.require(:recipe).permit(:title, :description, :image, ingredients_attributes: [:id, :name, :_destroy], directions_attributes: [:id, :step, :_destroy])
end
我真的不知道他为什么能够引用 :recipe
作为参数。我对参数的粗略理解是它们本质上是 table 中的列,但是上面的示例暗示它们也可以是 table 本身的名称。 (没有列命名为 "recipe",尽管其中一个 table 被命名为 "recipes")。
当我生成模型 MyThing
(单数 CamelCase)并因此生成相应的 table、my_things
(复数 snake_case)时,我的理解是否正确? , 我自动有一个相应的参数 :my_thing
(带冒号的单数 snake_case)供我使用?
我的问题如下:
- 以上理解准确吗?
- 除了 table 名称和列名之外,还有其他参数对应吗?如果有,它们是什么?
- 有没有办法列出我可以使用的参数(类似于
rake routes
)?
非常感谢您提供的任何说明!
控制器中可用的 params
仅仅是浏览器中表单中字段名称的结果。表单中字段的名称遵循 Rails 使用您在视图中使用的表单辅助函数创建的约定。
当您在视图中看到此内容时:
= form_for @recipe do |f|
= f.text_field :title
然后将生成以下内容 HTML:
<form stuff-here>
<input name="recipe[title]" other-stuff>
并且 HTML 中的 name
属性将导致该字段的值在您的控制器中公开为 params[:recipe][:title]
那是 其中params 来自,如果您更改其中的任何部分,那么 params
的名称将会不同。
所以对于你的问题:
- 有点,你得出了正确的结论,但也许不知道为什么:)
- 您可以使用任何您喜欢的
params
,这取决于您使用的表单助手以及您如何使用它们。一切都可以被覆盖。 - 您始终可以在您的控制器中执行:
logger.debug params.inspect
,这样您就可以看到(在您的log/development.log
文件中)有哪些params
供您使用。
params
散列基本上是浏览器(或API 客户端)发送的数据。它们没有在任何地方定义,因为浏览器可以向您发送任何它想要的东西(尝试在您的应用程序中将 &foo=bar 添加到 URL 的末尾,看看这如何向参数添加条目),尽管通常您应用程序可能希望数据具有某种形状。
对自己的参数意义不大;重要的是如何使用它们。如果将它们传递给 SomeModel.create
,那么键应该是模型中属性的名称(并且您应该使用强参数来控制可以设置的属性)。这只是它们的一种(尽管经常)使用:例如,它们可能包含搜索条件。