Rails:是什么决定了传递的“参数”的名称?

时间:2019-04-26 14:44:06

标签: ruby-on-rails

所以对于这个看似简单的问题,我在互联网上找不到答案。

我通过教程应用程序经历的内容,例如基本的CRUD应用程序...,并且可以说您的普通用户创建/编辑/更新/删除页面。

通常,您会看到类似的内容:

params.require(:user).permit(:name, :email, :password, :password_confirmation)

所以这意味着传递的参数正确params(:user)吗?

但是有时候,例如当执行link_to并将某些东西传递给POST请求时(例如补丁或更新之类的东西),参数就是params[:id]。是什么决定了params(:<name>)将被称为什么?

它似乎取决于形式...但是有时不取决于形式吗?是否只是默认为id还是其他?

3 个答案:

答案 0 :(得分:1)

路轨指南mentions this

params是以下各项的组合:

  1. 路由参数
  2. GET参数(example.org/page?some_param=value
  3. POST参数(表单数据,解码的json等)

params[:id]通常来自路由参数(/users/:id),可能还有其他路由参数(例如,其他常见情况是诸如/users/:user_id/some_other_resources/:id之类的嵌套路由-将有{{1} }和:user_id) 并按照惯例将保存的对象传递到:id

答案 1 :(得分:1)

参数是HTTP请求的一部分。 HTTP请求对可以作为参数发送的内容没有任何限制(发送数据的大小之外)。因此,您可以使用params将请求发送到服务器上的任何路由。

Rails试图防止任何邪恶,偷偷摸摸的人将不属于他们的参数和值注入。为此,我们可以创建一个将params对象包装在指定结构中的方法:

params.require(:user).permit(:name, :email, :password, :password_confirmation)

这意味着params必须以以下格式发送:

user: {
  name: "name",
  password: "password",
  password_confirmation: "password"
}

如果您检查开发日志,Rails将在每个请求中显示您的参数(应该发送)。如果您的参数不是这种格式(用户在根级别),并且您使用方法user_params,它将引发错误。 user必需。并且应该有人发送参数:

user: {
  name: "name",
  pseudonym: "sneaky param",
  password: "password",
  password_confirmation: "password"
}

Rails仍将接受namepasswordpassword_confirmation,但是它将拒绝pseudonym,因为您的方法user_params不允许。 / p>

您将看到很多代码,人们可以直接获取params[:id]值。那是因为我们经常只使用它来读取或销毁项目。 *_params方法通常保留用于控制器中的CREATE和UPDATE操作,因为这是我们注入参数的地方。

从技术上讲这不是必需的。 Rails已经清除了Active Record查询中的用户输入。因此,这并不是对安全应用程序的直接要求。您可以直接从params哈希中提取params,而不是使用此方法。但这肯定会使您的代码保持干燥。它还可以确保您不授予用户访问模型中重要元数据的权限。例如,如果您是SO,则可能(尽管不太可能)在我的帖子中有upvote列。如果将所有参数列入白名单,并且仅将所有参数接受到Post.update(params)方法中,则可以使用参数POST发送一个upvotes: 1,000,000请求。我认为他们根本不想要那样。

答案 2 :(得分:1)

可以通过路线,输入标签或您来确定。

按路线:

rails routes -g user 
   Prefix Verb   URI Pattern               Controller#Action
   signup GET    /signup(.:format)         users#new
    users GET    /users(.:format)          users#index
          POST   /users(.:format)          users#create
edit_user GET    /users/:id/edit(.:format) users#edit
     user GET    /users/:id(.:format)      users#show
          PATCH  /users/:id(.:format)      users#update
          PUT    /users/:id(.:format)      users#update
          DELETE /users/:id(.:format)      users#destroy

在这里,params[:id]edit_user_path(@user)之类的URL帮助程序设置。您可以在config/routes.rb中设置自己的参数名称:

get 'profile/:user_id', to: 'users#show'
rails routes -g profile 
Prefix Verb URI Pattern                 Controller#Action
       GET  /profile/:user_id(.:format) users#show

通过输入:

<%= form_for @user... do |f| %>
  <%= f.text_field :name
<% end %>

此处,表单设置了params: {user: {name: some_value}},因为表单使用的模型对象是User,列名是name

还有你:

link_to 'Profile', user_path(@user, locale: 'en')

其输出:<a href=\"/users/1?locale=en\">Profile</a>