无法通过嵌套表单的验证

时间:2017-02-07 13:54:11

标签: ruby-on-rails validation

我有一个模型Biblio和一个模型作者。它们相互之间是相互关联的。

添加一个新的biblio,我有一个嵌套的表单。我这样做是这样的:

<%= form_for :biblio, url: administration_add_biblio_path do |f| %>

<%= f.fields_for :authors, Author.new do |aut| %>
        <%= aut.hidden_field :name , :name =>"biblio[authors][1]" %>
    <% end %>

这是发送给控制器的参数的一部分:

"biblio"=>{"authors"=>{"1"=>{"name"=>"Vabien"}}, "title"=>"test",....

在biblios_controller中,我有这个:

def params_biblio
    params.require(:biblio).permit(
         :authors)

有这个问题:Unpermitted parameter: authors

模特Biblio看起来像这样:

class Biblio < ApplicationRecord
    has_and_belongs_to_many :authors
    validates_presence_of :authors
    accepts_nested_attributes_for :authors
    validates_associated :authors

和班级作者:

class Author < ApplicationRecord

    has_and_belongs_to_many :biblios
    validates :given_name, presence: true
    validates :name, presence: true

问题是作者的验证总是失败。我想这是因为[:author][:name]被传递给作者模型 - 但我不确定那是问题,如果是,如何解决它。

我应该补充一点,biblio可以拥有一大堆作者,但只需要验证作者[“1”]的存在。

2 个答案:

答案 0 :(得分:0)

在这个意义上,嵌套的强参数有点棘手。您必须定义嵌套参数才能使其工作。所以试试这个:

params.require(:biblio).permit(authors: :name)

或与其他参数:

params.require(:biblio).permit(:title, authors: :name)

答案 1 :(得分:0)

我认为问题是对象中的“1”键被传递回控制器。将作者作为数组而不是对象传递回来会更有意义。

"biblio"=>{"authors"=>[{"name"=>"Vabien"}], "title"=>"test",....