我的注册表单是Users模型的表单,它为公司提供字符串值。但是,我刚刚对用户belongs_to公司进行了更改。因此,我需要将Company的对象传递给Users模型。
我想使用表单中的字符串值来获取Company的对象:
@user.company = Company.find_by_name(params[:company])
我相信上面的工作,但是当我打电话时,表格是将:company(字符串)传递给模型:
@user = User.new(params[:user])
因此,在将其传递给User模型之前,我想知道(并且无法找到)删除:company param。
答案 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>