什么使 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)供我使用?

我的问题如下:

  1. 以上理解准确吗?
  2. 除了 table 名称和列名之外,还有其他参数对应吗?如果有,它们是什么?
  3. 有没有办法列出我可以使用的参数(类似于 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 的名称将会不同。

所以对于你的问题:

  1. 有点,你得出了正确的结论,但也许不知道为什么:)
  2. 您可以使用任何您喜欢的 params,这取决于您使用的表单助手以及您如何使用它们。一切都可以被覆盖。
  3. 您始终可以在您的控制器中执行:logger.debug params.inspect,这样您就可以看到(在您的 log/development.log 文件中)有哪些 params 供您使用。

params 散列基本上是浏览器(或API 客户端)发送的数据。它们没有在任何地方定义,因为浏览器可以向您发送任何它想要的东西(尝试在您的应用程序中将 &foo=bar 添加到 URL 的末尾,看看这如何向参数添加条目),尽管通常您应用程序可能希望数据具有某种形状。

对自己的参数意义不大;重要的是如何使用它们。如果将它们传递给 SomeModel.create,那么键应该是模型中属性的名称(并且您应该使用强参数来控制可以设置的属性)。这只是它们的一种(尽管经常)使用:例如,它们可能包含搜索条件。