所以对于这个看似简单的问题,我在互联网上找不到答案。
我通过教程应用程序经历的内容,例如基本的CRUD应用程序...,并且可以说您的普通用户创建/编辑/更新/删除页面。
通常,您会看到类似的内容:
params.require(:user).permit(:name, :email, :password, :password_confirmation)
所以这意味着传递的参数正确params(:user)
吗?
但是有时候,例如当执行link_to
并将某些东西传递给POST请求时(例如补丁或更新之类的东西),参数就是params[:id]
。是什么决定了params(:<name>)
将被称为什么?
它似乎取决于形式...但是有时不取决于形式吗?是否只是默认为id
还是其他?
答案 0 :(得分:1)
路轨指南mentions this
params
是以下各项的组合:
example.org/page?some_param=value
) 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仍将接受name
,password
和password_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>