簡體   English   中英

Rails 3創建到Rails4強參數

[英]Rails 3 create to Rails4 strong parameter

我將Rails 3項目轉換為Rails4,但是我對strong parameter感到困惑。

這是Rails 3的原始代碼

series_mission = SeriesMission.create({name: params[:name], mode: Mission.mode_mapping(params[:mode].to_s), start_time: start_time, end_time: end_time, gamecharacter_id: gc.id}, :without_protection => true)

工作正常。 但是在我在Rails 4修改之后,這是錯誤的。

attrs = { name: params[:name], mode: Mission.mode_mapping(params[:mode].to_s), start_time: start_time,
     end_time: end_time, gamecharacter_id: gc.id }
attrs = attrs.require(:series_mission).permit(:name, :mode, :start_time, :end_time, :gamecharacter_id)
series_mission = SeriesMission.create(attrs)

它引發了這個錯誤

private method `require' called for #<Hash:0x007fd2a421e8b8>

更新

qset_ids = params[:sub_missions]
start_time = ((t = params[:start_time].to_i) == 0 ? nil : Time.at(t))
end_time = ((t = params[:end_time].to_i) == 0 ? nil : Time.at(t))

只有gamecharacter_id沒有通過params傳遞

您誤解了強參數的目的。 它們用於將傳入數據列入白名單 但是,由於您已經做到了(通過構建哈希),因此不需要強大的參數。

attrs = { name: params[:name], mode: Mission.mode_mapping(params[:mode].to_s), start_time: start_time,
     end_time: end_time, gamecharacter_id: gc.id }
series_mission = SeriesMission.create(attrs)

白名單是什么意思?

假設您有一個個人資料編輯頁面。 在那里您可以更改名稱和圖片。 您應用中的某些用戶可以是管理員。 此狀態由數據庫is_admin的布爾值列控制。 自然,您無法通過該個人資料編輯用戶界面將用戶設為管理員,因為沒有復選框。 但是,惡意用戶可以偽造自己喜歡的請求並發送數據,就好像這樣的復選框一樣。 並且您會盲目接受它並使其成為管理員。

使用強大的參數,您可以將要處理的數據列入白名單

params.require(:user).permit(:name, :picture)

在此,即使請求中存在is_admin參數,也會將其丟棄並在更新操作中不使用。

如您所見,您的問題中的代碼不會受到影響,因為存在“自然的”白名單。

強參數僅用於批量分配。 就像您手動傳遞每個單獨的屬性一樣,您根本不需要使用強參數。 這將起作用:

attrs = { name: params[:name], mode: Mission.mode_mapping(params[:mode].to_s), start_time: start_time,
 end_time: end_time, gamecharacter_id: gc.id }

series_mission = SeriesMission.create(attrs)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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