Rails fields_for 表单未显示,嵌套表单

Posted

技术标签:

【中文标题】Rails fields_for 表单未显示,嵌套表单【英文标题】:Rails fields_for form not showing up, nested form 【发布时间】:2013-06-15 01:54:03 【问题描述】:

我创建了一个简单的 Rails 项目。一切正常,直到我尝试添加一个新模型 Paintings belongs_to 处理和一个 Patient has_many 通过处理进行绘画。所以不知何故我创建的嵌套表单没有出现,我相信它与控制器有关!谢谢,来自德国的问候!

治疗控制器:

class TreatmentsController < ApplicationController
  def create
    @patient = Patient.find(params[:patient_id])
    @treatment = @patient.treatments.create(params[:treatment])
    redirect_to patient_path(@patient)
  end

  def destroy
    @patient = Patient.find(params[:patient_id])
    @treatment = @patient.treatments.find(params[:id])
    @treatment.destroy
    redirect_to patient_path(@patient)  
  end
end

还有没有显示nested fields_for 的治疗表格:

<%= form_for([@patient, @patient.treatments.build]) do |f| %>
  <div class="field">
    <%= f.label :content %>
    <%= f.text_area :content, :cols => "30", :rows => "10" %>
  </div>
  <div class="field">
    <%= f.label :category_id %>
    <%= f.collection_select :category_id, Category.find(:all), :id, :typ %>
  </div>

  <%= f.fields_for :paintings do |ff| %>
    <div class="field">
      <%= ff.label :name, 'Tag:' %>
      <%= ff.text_field :name %>
    </div>
  <% end %>

  <div class="field">
    <%= f.submit nil, :class => 'btn btn-small btn-primary' %>
  </div>
<% end %>

更新:

展会现场:

<% @patient.treatments.each do |treatment| %>
  <tr>
    <td><%= treatment.category.try(:typ) %></td>
    <td><%= treatment.content %></td>
    <td><%= treatment.day %></td>
    <td><div class="arrow"></div></td>
  </tr>
  <tr>

【问题讨论】:

试试 f.fields_for :paintings, Painting.new do |m|。另外,你能把模型代码和控制器代码更详细地贴出来吗? 哈哈你最好!我试了两天,现在你只用了一点点代码就做到了!请将您的评论移至答案,以便我将其设置为正确答案! 【参考方案1】:

请尝试

= f.fields_for :paintings, Painting.new do |p|

【讨论】:

对不起,还有一件事,我怎样才能显示图像的名称? 我真的对模型关系或字段一无所知。你可以添加它们吗? 我的意思是我在更新中添加到我的帖子中的同一视图!所以还有另一个带有图像名称的 除非您指定了一些默认值,否则您无法为新建的绘画对象显示绘画名称。在“表单”中,除非您指定了默认值,否则您不能使对象字段保持“零”值。在您列出治疗的更新视图中,您可以显示特定治疗的所有绘画的名称。 让我们continue this discussion in chat 【参考方案2】:

即使这个问题已经很老了,但你错过了对这个问题至关重要的newdestroycreate 方法与此问题无关。如果你有一个new 方法,看起来像这样:

class TreatmentsController < ApplicationController
  def new
    @patient = Patient.new
  end
end

然后解决方案是修改new 方法以“构建”paintings,如下所示:

class TreatmentsController < ApplicationController
  def new
    @patient = Patient.new
    @patient.paintings.build
  end
end

【讨论】:

是的,但是这些演示代码没有.build 操作:-( github.com/nathanvda/cocoon_simple_form_demo/blob/master/app/… @zx1986 they don't have build action 是什么意思?我的意思是它不应该有构建动作。 build 只是对象的一种方法。【参考方案3】:

尝试在控制器中执行以下新操作

@patient.treatments.build

查看 build_association 部分http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-belongs_to

您还应该阅读有关嵌套属性的信息。 使用这些作为参考 http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html

【讨论】:

这是一个错误的语法。试试@patient.treatments.build【参考方案4】:

对谁有用,我正在使用:

<% f.fields_for :partner do |fp| %>

代替:

<%= f.fields_for :partner do |fp| %>

【讨论】:

我在haml 文件中犯了同样的错误,我想知道我的表格到底有什么问题,持续了 30 分钟......哦,我的上帝......我使用 - f.fields_for :partner do |fp| 而不是 @ 987654325@【参考方案5】:

如果你有一个可选的关联:

在控制器中:

@associated_model = @model.associated_model || @model.build_associated_model

在视图中:

<%= form.fields_for :associated_model do |am| %>

【讨论】:

以上是关于Rails fields_for 表单未显示,嵌套表单的主要内容,如果未能解决你的问题,请参考以下文章

嵌套表单 gem 和 jquery 的 Rails 问题

ruby 使用Rails中的fields_for编辑表单

Rails:使用 fields_for 和 check_box

Rails jQuery 自动完成和动态嵌套字段

rails wicked gem has_one 关联和嵌套形式

嵌套 Rails 表单中的动态值未更新