2011-03-01 101 views
86

我的註冊表單是Users模型的一種表單,它爲公司提供一個字符串值。但是,我剛剛進行了一項更改,使用戶屬於公司。因此,我需要將公司的一個對象傳遞給用戶模型。如何從params [:something]中刪除一個字段

我想使用的字符串值從形式獲得公司的目標:

@user.company = Company.find_by_name(params[:company]) 

我相信上述作品,但形式傳遞:公司(這是字符串)到模型時,我呼籲:

@user = User.new(params[:user]) 

因此,我想知道(和怎麼也找不到)刪除:它傳遞給用戶模型之前,公司PARAM。

回答

170

使用Hash#delete您可以刪除一個哈希鍵/值對:如果它包含在PARAMS

params.delete :company 

[:用戶],然後你會使用這樣的:

params[:user].delete :company 
+0

這是偉大的,但我們應該做的控制器內?好像控制器知道太多關於這個觀點,如果我們這樣做。 – jn29098 2013-02-25 02:43:43

+14

我正在使用Rails 4.0,'model_params.delete:key_name'不工作 - 任何想法爲什麼?從params散列刪除 – Zorayr 2013-10-22 05:54:00

+11

是一個非常糟糕的想法。在調試過程中容易讓人們感到困惑......使用您傳遞的自定義散列來分配屬性,例如使用'''assin_params = params.dup.delete(:company)'''。不要直接從params中刪除 – 2013-11-08 10:45:14

1
respond_to do |format| 
    if params[:company].present? 
    format.html {redirect_to(:controller=>:shopping, :action=>:index)} 
    else 
    format.html 
    end 

這會從網址中刪除params

71

您應該使用hash.except

class MyController < ApplicationController 
    def explore_session_params 
    params[:explore_session].except(:account_id, :creator) 
    end 
end 

它完成2件事:允許您一次排除多於1個鍵,並且不修改原始散列。

+6

這比接受的答案要好得多。 – 2014-11-04 14:49:16

+3

這是一個很棒的回答 – 2015-01-08 19:45:16

+0

Rails 4 ActionController :: Parameters繼承了哈希,所以除了或者提取!會工作,在Rails 5中,它有[except](http://edgeapi.rubyonrails.org/classes/ActionController/Parameters.html#method-i-except)並解壓!在ActionController :: Parameters本身中定義的方法 – kangkyu 2016-01-28 01:35:07

1

正確的方式實現這一目標是使用strong_params

class UsersController < ApplicationController 
    def create 
    @user = User.new(user_params) 
    end 

    private 

    def user_params 
    params.require(:user).permit(:name, :age) 
    end 
end 

這樣你有更多的控制權,其PARAMS應該傳遞給模型