2011-03-01 102 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应该传递给模型