Rails當中的params是什麼?


我們常在Rails的controller中看到以下code:

def show
    @post = Post.find(params[:id])
end

大家都知道一般的show action是要顯示單一項目的資料,但為什麼是params[:id]而不單純就是id或:id呢?

這邊先解釋一下http request:當使用者點擊連結的時候,會把一個http request送回伺服器,讓伺服器根據需求來將內容傳回瀏覽器。最簡單的例子就是我們輸入google.com時,傳送了一個http request給google的伺服器,他才將首頁內容回傳到瀏覽器上並顯示。

在Rails當中,http request會經過ActionController這個內建的機制來消化,並將可用的變數轉換為params這個變數,交由controller處理。底下會包含許多例如填寫表格的內容或其他變數,以hash的方式呈現:

params = {:post => "Rails is Good", :content => "I love Ruby on Rails"}

因此我們在controller當中使用params時,就是在讀取瀏覽器回傳的http request。

不過要注意,params不等於http request本身,因為request本身的資訊量很多,Rails並不會全部包到params裡面,因此如果有使用開發者工具來觀看從前端傳送的http request,會發現跟我們在後端可以使用的params並不相同。

我們在controller當中撰寫params[:id]時,所指的其實是從前端回傳的:id。

params 在 Strong Parameters當中的意義

在Rails 4當中有strong parameters的機制,限定必須是我們設定可以在這個action當中進行設定的參數,才可以傳入,詳細解釋可在延伸閱讀中查詢。

為了將前端傳回的變數儲存到model當中,我們會在controller撰寫一個private method:

private
    def post_params
        params.require(:post).permit(:title, :content)
    end

在這邊可以看到,我們要先定義一個method來回傳允許通過的params,其中分成兩個部分:

1. require會把:post這個model相關的參數給抓出來,如果根本沒有回傳:post相關參數,就會產生錯誤訊息。 2. permit就是設定有哪些參數可以傳入,例如上面沒有寫參數,就算你從http request當中傳入,也會回傳nil當做沒東西。例如:

post_params = params.require(:post).permit(:title, :content)

post_params[:title]
# => "Rails is Good"

post_params[:user_id]
# => nil

在Strong parameters的機制當中,就是依靠params來控制參數。從今以後,看到params就知道是什麼意思了!

延伸閱讀

Rails實戰聖經

Rails API

Xdite部落格:Strong Parameters