如何从参数中删除字段[:something]


116

我的注册表格是用于用户模型的表格,它采用公司的字符串值。但是,我刚刚进行了更改,使用户属于公司。因此,我需要将Company对象传递给Users模型。

我想使用表单中的字符串值获取Company的对象:

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

我相信上面的方法有效,但是当我调用时,表单会将:company(字符串)传递给模型:

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

因此,我想知道(并且找不到方法)在将:company参数传递给User模型之前将其删除。

Answers:


209

Rails 4/5-编辑的答案 (请参阅评论)

自从编写此问题以来,Rails的较新版本已添加了摘录!并且除了例如:

new_params = params.except[the one I wish to remove]

这是一种更安全的方法,可将所需的所有参数“抓取”到副本中,而不会破坏传入的参数中的原始参数(这不是一件好事,因为随着时间的推移,这将使调试和维护代码变得非常困难)。

或者您可以直接通过而不复制,例如:

@person.update(params[:person].except(:admin))

extract!(有!砰运营商)将修改原来那么更为谨慎使用!

原始答案

您可以使用Hash#delete以下方法从哈希中删除键/值对:

params.delete :company

如果它包含在params [:user]中,那么您将使用以下代码:

params[:user].delete :company

16
我正在使用Rails 4.0,model_params.delete :key_name但无法正常工作-知道为什么吗?
Zorayr

13
从params哈希中删除是一个非常糟糕的想法。在调试等过程中容易使人困惑。...使用传递给您的自定义哈希值来分配属性,例如use assin_params = params.dup.delete(:company)。永远不要直接从参数中删除
Dominik Goltermann

4
我的意思是assign_params = params.dup; assign_params.delete(:company)
Dominik Goltermann

12
@Zorayr我有同样的问题。对我来说,因为我model_params是一个函数,所以从中拉出了相关的参数params。因此,当您delete离开时,model_params实际上只是从model_params返回的哈希中删除。
露西·贝恩

1
user_params是一种方法,因此当您执行user_params.delete(:this_param)时,它会计算正确的哈希值,但是对user_params的任何后续调用都会从头开始重新计算哈希值。这就是为什么@Gaul说这是个坏主意的原因。在Rails 5中,您现在有了params.except方法,并且还可以提取!
rmcsharry16年

89

您可能应该使用hash.except

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

它完成了两件事:允许您一次排除多个键,并且不修改原始哈希。


Rails 4 ActionController :: Parameters继承了Hash,所以除外或extract!会工作,在Rails 5中,它具有except和提取!在ActionController :: Parameters本身中定义的方法
kangkyu

我实际上在UPDATE方法中有此哈希参数。除了拥有"-1"钥匙的人,我该怎么办?{“ utf8” =>“✓”,“ _method” =>“补丁”,“ authenticity_token” =>“ VtY ...”,“手册” => {“ title” =>“ Hello world”,“ profilings_attributes” => {“ -1” => {“ member_profile_id” =>“ 3”},“ 0” => {“ percentage” =>“ 10.0”,“ description” =>“ Some description!”,“ _destroy” = >“ false”,“ id” =>“ 10”},“ 1” => {...}},“ sponsorings_attributes” => {“ -1” => {“ sponsor_id” =>“ 2”}, “ 0” => {“ brochure_id” =>“

2

实现此目的的正确方法是使用 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

这样,您可以更好地控制应将哪些参数传递给模型


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

这将从网址中删除参数


0

要删除您可以做一个备忘录

def parameters
  @parameters ||= params.require(:root).permit(:foo, :bar)
end

现在您可以执行以下操作:

parameteres.delete(:bar)
parameters
=> <ActionController::Parameters {"foo" => "foo"} permitted: true>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.