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

pro*_*nce 107 ruby-on-rails

我的注册表单是Users模型的表单,它为公司获取字符串值.但是,我刚刚对用户belongs_to公司进行了更改.因此,我需要将Company的对象传递给Users模型.

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

@user.company = Company.find_by_name(params[:company])
Run Code Online (Sandbox Code Playgroud)

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

@user = User.new(params[:user])
Run Code Online (Sandbox Code Playgroud)

因此,在将其传递给User模型之前,我想知道(并且无法找到)删除:company param.

Jer*_*ten 196

Rails 4/5 - 编辑答案 (见评论)

由于这个问题是写的,Rails的新版本添加了提取物!并且除了如:

new_params = params.except[the one I wish to remove]
Run Code Online (Sandbox Code Playgroud)

这是一种更安全的方法,可以将所需的所有参数"抓取"到副本中而不会破坏传递的参数(这不是一件好事,因为它会使代码的调试和维护变得非常困难).

或者你可以直接传递而不复制,例如:

@person.update(params[:person].except(:admin))
Run Code Online (Sandbox Code Playgroud)

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

原始答案

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

params.delete :company
Run Code Online (Sandbox Code Playgroud)

如果它包含在params [:user]中,那么你可以使用它:

params[:user].delete :company
Run Code Online (Sandbox Code Playgroud)

  • 我正在使用Rails 4.0,并且`model_params.delete:key_name`不起作用 - 任何想法为什么? (16认同)
  • 从params散列中删除是一个非常糟糕的想法.在调试等过程中容易混淆人们...使用你传递的自定义哈希来分配属性,例如使用```assin_params = params.dup.delete(:company)```.永远不要直接删除params (13认同)
  • @Zorayr我有同样的问题.对我而言,这是因为我的`model_params`是一个函数,它将相关的参数从"params"中拉出来.所以当你从`model_params`中删除`时,你真的只是从'model_params`返回的哈希中删除. (12认同)
  • 我的意思是```assign_params = params.dup; assign_params.delete(:公司)``` (4认同)

sam*_*sam 88

您可能应该使用hash.except

class MyController < ApplicationController
  def explore_session_params
    params[:explore_session].except(:account_id, :creator)
  end
end
Run Code Online (Sandbox Code Playgroud)

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

  • 这比接受的答案要好得多. (10认同)
  • 这是一个很棒的答案 (3认同)