[英]What's the right way to modify the params passed to controller in rails 3.1.0?
[英]Rails: What determines name of "params" passed?
所以我在互聯網上找不到這個看似簡單的問題的答案。
我經歷過的教程應用程序,比如說一個基本的 CRUD 應用程序......讓我們說你的普通用戶創建/編輯/更新/刪除頁面。
通常,您會看到類似以下內容:
params.require(:user).permit(:name, :email, :password, :password_confirmation)
所以這意味着傳遞的參數是params(:user)
對嗎?
但是有時,例如在執行link_to
並將某些內容傳遞給 POST 請求(例如補丁或更新或類似內容)時,參數只是params[:id]
。 什么決定了params(:<name>)
將被稱為什么?
它似乎取決於形式……但有時不是? 它是否只是默認為id
或其他什么?
Rails 指南提到了這一點
params
是以下各項的組合:
example.org/page?some_param=value
) params[:id]
通常來自路由參數( /users/:id
),可以有其他路由參數(例如其他常見情況是嵌套路由,如/users/:user_id/some_other_resources/:id
- 會有:user_id
和:id
) 並且按照約定保存的對象在params[:model_name]
傳遞
參數是 HTTP 請求的一部分。 HTTP 請求對可以作為參數發送的內容沒有限制(在發送的數據大小之外)。 因此,您可以使用參數向服務器上的任何路由發送請求。
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
不允許這樣user_params
。
你會在很多代碼中看到,人們直接獲取params[:id]
值。 那是因為我們通常只使用它來讀取或銷毀項目。 *_params
方法通常保留用於控制器中的 CREATE 和 UPDATE 操作,因為這是我們注入參數的地方。
這在技術上是沒有必要的。 Rails 已經在 Active Record 查詢中清理用戶輸入。 因此,這不是安全應用程序的直接要求。 您可以直接從 params 哈希中提取參數,而不是使用此方法。 但它肯定會讓你的代碼保持干燥。 它還確保您不會授予用戶對模型中重要元數據的訪問權限。 例如,如果您是 SO,您可能(雖然不太可能)為我的帖子設置一個 upvote 列。 如果您將所有參數列入白名單並僅將所有參數Post.update(params)
方法中,我可以發送帶有 params upvotes: 1,000,000
的POST
請求。 我不認為他們會喜歡那樣。
它可以由路線、輸入標簽或您來確定。
按路線:
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]
由 url helper 設置,如edit_user_path(@user)
。 您可以在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>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.