簡體   English   中英

Rails:什么決定了傳遞的“params”的名稱?

[英]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是以下各項的組合:

  1. 路由參數
  2. GET 參數( example.org/page?some_param=value
  3. POST 參數(表單數據、解碼后的 json 等)

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 仍會接受namepasswordpassword_confirmation ,但它會拒絕pseudonym因為您的方法user_params不允許這樣user_params

你會在很多代碼中看到,人們直接獲取params[:id]值。 那是因為我們通常只使用它來讀取或銷毀項目。 *_params方法通常保留用於控制器中的 CREATE 和 UPDATE 操作,因為這是我們注入參數的地方。

這在技術上是沒有必要的。 Rails 已經在 Active Record 查詢中清理用戶輸入。 因此,這不是安全應用程序的直接要求。 您可以直接從 params 哈希中提取參數,而不是使用此方法。 但它肯定會讓你的代碼保持干燥。 它還確保您不會授予用戶對模型中重要元數據的訪問權限。 例如,如果您是 SO,您可能(雖然不太可能)為我的帖子設置一個 upvote 列。 如果您將所有參數列入白名單並僅將所有參數Post.update(params)方法中,我可以發送帶有 params upvotes: 1,000,000POST請求。 我不認為他們會喜歡那樣。

它可以由路線、輸入標簽或您來確定。

按路線:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM