是否有可能在Rails中需要多个强参数?

时间:2015-07-14 17:57:23

标签: ruby-on-rails

我正在尝试为Rails中的表单进行一些服务器端验证,我想要求特定字段具有值。以下是我的控制器中的参数:

private
def post_params
  params.require(:post).permit(:title, :text, :slug)
end

问题是服务器只是允许这些参数 - 它不需要它们,所以可以提交一个完全空白的表格。

我的理解是params.require只接受一个论点,我试图解决这个问题但没有成功:

private
def post_params
  params.require(:post, :title, :text, :slug)
end
# => wrong number of arguments (4 for 1)

private
def post_params
  all_params = [:post, :title, :text, :slug]
  params.require(all_params)
end
# => param is missing or the value is empty: [:post, :title, :text, :slug]

private
def post_params
  params.require(:post).require(:title).require(:text).require(:slug)
end
# => private method `require' called for "test thing":String

有没有办法要求多个强对数?

2 个答案:

答案 0 :(得分:6)

强参数用于质量分配。质量分配的含义是,当您提交表单时,会提交多个值,即模型的多个属性,以便您在params.require(:post).permit中添加它们。您正在看到单词permit,这意味着允许对此属性进行批量分配。现在假设你在控制器中写这个:

def post_params
  params.require(:post).permit(:title, :text, :slug)
end

在你的参数中假设你有:

{"post"=>{"title"=>'Test',"text"=>"Text test","slug"=>"any random name","type"=>"article"}}

现在,如果你这样做:

@post = Post.new(post_params)
@post.save

它会为您unpermitted parameters :type提供,因为您尚未将type参数列入白名单。这是出于安全原因而给出的,因此您只允许允许用户从视图中更新需要的属性。从轨道4开始引入强大的参数。

现在你需要这些参数来满足用户填充它们的需要,所以这需要在模型中完成,如下所示:

class Post < ActiveRecord::Base
  validates_presence_of :title, :text, :slug
end

这是一项验证,可以让用户必须输入title, text and slug。还有更多类型的验证和一些自定义验证,可以根据需要编写。

更多信息:

Strong Parameters

Validations

希望这有帮助

答案 1 :(得分:0)

不能(也不能)使用强参数来验证属性的存在。正如@Deep所说,您为此使用了验证状态。

学术问题仍然是如何要求多个强参数,“ params”一词在这里具有误导性,因为“ require”部分指定了属性哈希的键。只需要接受一个原因是因为通常表单提交时带有代表单个对象的属性哈希-嵌套。

从理论上讲,如果您的参数哈希看起来包含以下键/值对:

<div class="text-break vh-100">
    <div class="row h-25 overflow-auto">
        <div class="col"> aaaaa </div>
        <div class="col"> aaaaa </div>
        <div class="col"> aaaaa </div>
        <div class="col"> aaaaa </div>
    </div>
    ... (remaining rows)
</div>

您可能合法地希望同时满足this:和that的要求,并允许它们的属性独立(如果这样),您可以这样做:

... this: { name: 'this', number: 1 }, that: { color: 'red', size: 'big'} ...

它将返回:

def this_and_that_params
  { this: params.require(:this).permit(:name), that: params.require(:that).permit(:color) }
end