Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 通过另一个模型使用三个模型的嵌套表单?_Ruby On Rails_Ruby_Ruby On Rails 3_Forms_Model - Fatal编程技术网

Ruby on rails 通过另一个模型使用三个模型的嵌套表单?

Ruby on rails 通过另一个模型使用三个模型的嵌套表单?,ruby-on-rails,ruby,ruby-on-rails-3,forms,model,Ruby On Rails,Ruby,Ruby On Rails 3,Forms,Model,我试图创建一个嵌套表单,其中包含三个与through关联的模型 这是模式: 这些是模型: ../app/models/alimento.rb: class Alimento < ActiveRecord::Base attr_accessible :calorias, :nome, :refeicaos_attributes validates :nome, :calorias, :presence => { :message => "nao pode ficar

我试图创建一个嵌套表单,其中包含三个与through关联的模型

这是模式:

这些是模型:

../app/models/alimento.rb:

class Alimento < ActiveRecord::Base

  attr_accessible :calorias, :nome, :refeicaos_attributes

  validates :nome, :calorias, :presence => { :message => "nao pode ficar em branco" }
    has_many :controles, :dependent => :destroy
    has_many :refeicaos, through: :controles
    has_many :diarios, through: :controles

    accepts_nested_attributes_for :controles
end
我正试着做这个例子

观点:

../app/views/diarios/new.html.erb:

<%= form_for @diario do |f| %>
  <div class="field">
    <%= f.label :data %>
    <%= f.date_select :data %>
    <br>
  </div>
  <%= f.fields_for :refeicaos do |builder| %>
    <%= render 'refeicao_fields', f: builder %>      
  <% end %>
  <%= link_to_add_fields "Adicionar Refeição", f, :refeicaos %>
</br>
</br>
  <div class="actions">
    <%= f.submit "Cadastrar Controle" %>
  </div>
<% end %>
</br>
<%= link_to 'Voltar', root_path %>
<fieldset>
  <strong>Refeição: </strong></br>
  <%= f.label :nome, "Nome da Refeição", :style => 'margin-left: 5px;' %>
  <%= collection_select(:refeicao, :id, Refeicao.order(:nome), :id, :nome) %>
  <%= f.check_box :_destroy %>
  <%= f.label :_destroy, "Remover Refeição" %>
</br>
</br>
  <strong>Alimentos:</strong></br>
  <%= f.fields_for :alimentos do |builder| %>
    <%= render 'alimento_fields', f: builder %>
  <% end %>
  <%= link_to_add_fields "Adicionar Refeição", f, :alimentos %>
</fieldset>
<fieldset>
  <%= f.label :alimento, "Nome do Alimento:" %>
  <%= collection_select(:alimento, :id, Alimento.order(:nome), :id, :nome) %>
  <%= f.hidden_field :_destroy %>
    <%= f.fields_for :controles do |builder| %>
    <%= render 'controle_fields', f: builder %>
  <% end %>
  <%= link_to "Remover alimento", '#', class: "remove_fields" %></br>

</fieldset>
<fieldset>
  <%= f.label :alimento, "Quantidade:", :style => 'margin-left: 42px;' %>
  <%= f.number_field :quantidade, :style => 'width: 50px;' %>
</fieldset>
我得到这个错误:

NoMethodError in Diarios#new

Showing D:/aplicacoes_indie/AppDieta/app/views/diarios/_refeicao_fields.html.erb where line #13 raised:

undefined method `alimentos' for nil:NilClass
Extracted source (around line #13):

10:   <%= f.fields_for :alimentos do |builder| %>
11:     <%= render 'alimento_fields', f: builder %>
12:   <% end %>
13:   <%= link_to_add_fields "Adicionar Refeição", f, :alimentos %>
14: </fieldset>
../app/view/diarios/_controle_fields.html.erb


我认为这些是您应该需要的语句的唯一接受\u嵌套\u属性\u:

class Diario < ActiveRecord::Base
accepts_nested_attributes_for :refeicaos
以及:

现在语句正在设置生成器,但builder.object为nil

编辑-将字段名称更改为复数形式,因为这是一个有很多关系的字段。

尝试:

class Alimento < ActiveRecord::Base

  attr_accessible :calorias, :nome, :refeicaos_attributes

  validates :nome, :calorias, :presence => { :message => "nao pode ficar em branco" }
    has_many :controles, :dependent => :destroy
    has_many :refeicaos, through: :controles
    has_many :diarios, through: :controles

    accepts_nested_attributes_for :controles
end

class Refeicao < ActiveRecord::Base

  attr_accessible :nome, :alimentos_attributes, :controles_attributes, :diario_attributes

    validates :nome, :presence => { :message => "nao pode ficar em branco" }

    has_many :controles, dependent: :destroy
    has_many :alimentos, through: :controles
    has_many :diarios, through: :controles
    accepts_nested_attributes_for :alimentos
end

class Diario < ActiveRecord::Base

    has_many :controles, dependent: :destroy
    has_many :refeicaos, through: :controles
    has_many :alimentos, through: :controles
    accepts_nested_attributes_for :refaicoas

  attr_accessible :data, :controles_attributes, :refeicaos_attributes, :alimentos_attributes
end

class Controle < ActiveRecord::Base

  belongs_to :alimento 
  belongs_to :refeicao
  belongs_to :diario

  attr_accessible :quantidade, :alimento_id, :refeicao_id, :diario_id

end

我相信您会遇到此错误,因为Diario只能接受:controls而不是:refeicaos或:alimentos的嵌套属性。我尝试这样做,并在diarios中得到此错误:NoMethodError新显示D:/aplicacoes_indie/AppDieta/app/views/diarios/new.html.erb,其中第1行引发:NilClass:Class的未定义方法“model_name”第1:1:2:3:4行的摘录来源:您在新操作中是否更改了任何内容?如果没有,请改为尝试。我解决了这个问题,只是在accepts\u nested\u attributes\u for的名称中添加了一个's',例如:Class Refeicao accepts\u nested\u attributes\u for:alimentos而不是accepts\u nested\u attributes\u for:alimento感谢您的回答,现在表单会出现,但应该会在select from alimento下面控件中的数字字段'quantidade',我用图片编辑了这个问题。我没有注意到你有一个来自Controle的字段。您需要在Alimento模型中保留accepts_nested_attributes_for:Controls语句。是的,Alimento中已存在accepts_nested_attributes_for:Controls语句,但不显示字段quantidade。如果已保存日记并且存在适当的Controls表行以连接所有三个控件,则此表单布局应起作用记录。但我不确定在新动作中构建初始日志时是否有办法实现这一点。在这种情况下,Rails似乎总是试图将两行保存到Controls表中,一行用于diario refeicao链接,另一行用于refeicao alimento链接。您可能需要将其拆分为不同的视图,而不是一次编辑所有视图。但是a我不能保存日志,然后在同一操作中保存控件?
<fieldset>
  <%= f.label :alimento, "Quantidade:", :style => 'margin-left: 42px;' %>
  <%= f.number_field :quantidade, :style => 'width: 50px;' %>
</fieldset>
module ApplicationHelper
  def link_to_add_fields(name, f, association)
    new_object = f.object.send(association).klass.new
    id = new_object.object_id
    fields = f.fields_for(association, new_object, child_index: id) do |builder|
      render(association.to_s.singularize + "_fields", f: builder)
    end
    link_to(name, '#', class: "add_fields", data: {id: id, fields: fields.gsub("\n", "")})
  end
end
NoMethodError in Diarios#new

Showing D:/aplicacoes_indie/AppDieta/app/views/diarios/_refeicao_fields.html.erb where line #13 raised:

undefined method `alimentos' for nil:NilClass
Extracted source (around line #13):

10:   <%= f.fields_for :alimentos do |builder| %>
11:     <%= render 'alimento_fields', f: builder %>
12:   <% end %>
13:   <%= link_to_add_fields "Adicionar Refeição", f, :alimentos %>
14: </fieldset>
<fieldset>
  <%= f.label :alimento, "Nome do Alimento:" %>
  <%= collection_select(:alimento, :id, Alimento.order(:nome), :id, :nome) %>
  <%= f.hidden_field :_destroy %>
  <%= f.fields_for :controles do |builder| %>
    <%= render 'controle_fields', f: builder %>
  <% end %>
  <%= link_to "Remover alimento", '#', class: "remove_fields" %></br>

</fieldset>
<fieldset>
  <%= f.label :controle, "Quantidade:", :style => 'margin-left: 42px;' %>
  <%= f.number_field :quantidade, :style => 'width: 50px;' %>
</fieldset>
  def create
    @diario = Diario.new(params[:diario])

    respond_to do |format|
      if @diario.save
        format.html { redirect_to @diario, notice: 'Diario was successfully created.' }
        format.json { render json: @diario, status: :created, location: @diario }
      else
        format.html { render action: "new" }
        format.json { render json: @diario.errors, status: :unprocessable_entity }
      end
    end
  end
class Diario < ActiveRecord::Base
accepts_nested_attributes_for :refeicaos
class Refeicao < ActiveRecord::Base
accepts_nested_attributes_for :alimentos
class Alimento < ActiveRecord::Base

  attr_accessible :calorias, :nome, :refeicaos_attributes

  validates :nome, :calorias, :presence => { :message => "nao pode ficar em branco" }
    has_many :controles, :dependent => :destroy
    has_many :refeicaos, through: :controles
    has_many :diarios, through: :controles

    accepts_nested_attributes_for :controles
end

class Refeicao < ActiveRecord::Base

  attr_accessible :nome, :alimentos_attributes, :controles_attributes, :diario_attributes

    validates :nome, :presence => { :message => "nao pode ficar em branco" }

    has_many :controles, dependent: :destroy
    has_many :alimentos, through: :controles
    has_many :diarios, through: :controles
    accepts_nested_attributes_for :alimentos
end

class Diario < ActiveRecord::Base

    has_many :controles, dependent: :destroy
    has_many :refeicaos, through: :controles
    has_many :alimentos, through: :controles
    accepts_nested_attributes_for :refaicoas

  attr_accessible :data, :controles_attributes, :refeicaos_attributes, :alimentos_attributes
end

class Controle < ActiveRecord::Base

  belongs_to :alimento 
  belongs_to :refeicao
  belongs_to :diario

  attr_accessible :quantidade, :alimento_id, :refeicao_id, :diario_id

end