params 與 request


當請求來到伺服器時,Rails會收集請求資訊,你可以透過一些方法或物件來得知各種請求資訊,例如請求參數名稱與請求參數值可以透過params方法來取得,傳回的物件是ActiveSupport::HashWithIndifferentAccess的實例,父類別為Hash。ActiveSupport::HashWithIndifferentAccess與Hash的不同在於,如果以:name及"name"為鍵,前者會視作相同的鍵,而後者則不然

如果要指定請求參數名稱來取得對應的值,可以如下:

name = params[:name]

這會傳回String實例,若傳來的是像"123"這樣的字串值,而你需要的是整數型態,則必須使用to_i或Integer這類的方法將之剖析為整數型態。若請求中沒有所指定的請求參數名稱,則會傳回nil

如果表單上有可複選的元件,例如核取方塊(Checkbox)、清單(List)等,同一個請求參數名稱會有多個值,此時的HTTP查詢字串其實就是像name[]=10&name[]=20&name[]=30,此時可以用params[:name]方法取得一個Array實例,每個索引元素都是String實例,代表被選取的值。例如:

names = params[:name] # names 的內容會是["10", "20", "30"]

當然,[與]必須作URL編碼,如果要自行編碼,實際的請求參數必須是name%5B%5D=10&name%5B%5D=20&name%5B%5D。

如果是相同關係的請求參數,可以組織在一起,例如使用者資訊的發送,可以組織為user[name]=Justin&user[age]=20&user[city]=Kaohsiung的方式,實際作URL編碼則會是user%5Bname%5D=Justin&user%5Bage%5D=20&user%5Bcity%5D=Kaohsiung,此時可用params[:user]取得ActiveSupport::HashWithIndifferentAccess物件,內容為{"name" => "Justin", "age" => "20", "city" => "Kaohsiung"}。如果是user[address][city]=Kaohsiung&user[address][postcode]=804這類的請求參數,則可以使用params[:user][:address]取得內嵌的ActiveSupport::HashWithIndifferentAccess或者是直接用params[:user][:address][:city]來取得值。例如:

address = params[:user][:address]
city = address[:city]         # 或 params[:user][:address][:city]
postcode = address[:postcode] # 或 params[:user][:address][:postcode]

Rails預設可以接收POST方式傳送的JSON格式,如果有個JSON如下: