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

时间:2011-03-01 05:03:04

标签: ruby-on-rails

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

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

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

我相信上面的工作,但是当我打电话时,表格是将:company(字符串)传递给模型:

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

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

5 个答案:

答案 0 :(得分:190)

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

由于这个问题已经写好,Rails的新版本添加了extract!except,例如:

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

这是一种更安全的方法,可以将所需的所有参数复制到副本中而无需破坏传递的参数(这不是一件好事,因为它会随着时间的推移很难调试和维护代码)。

或者您可以直接传递而无需复制,例如:

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

extract!(有!bang运算符)会修改原文,所以请小心使用!

原始答案

您可以使用Hash#delete

从哈希中删除键/值对
params.delete :company

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

params[:user].delete :company

答案 1 :(得分:87)

您可能应该使用hash.except

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

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

答案 2 :(得分:1)

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

这会删除网址中的参数

答案 3 :(得分: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

通过这种方式,您可以更好地控制将哪些参数传递给模型

答案 4 :(得分:0)

要删除,可以执行备忘录

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

现在您可以这样做:

parameteres.delete(:bar)
parameters
=> <ActionController::Parameters {"foo" => "foo"} permitted: true>