在rails简单形式中嵌入/嵌套多个表单的最佳方法是什么?

时间:2014-09-16 10:55:19

标签: ruby-on-rails ruby-on-rails-4 simple-form nested-forms

我有一组模型可以执行以下操作:

1)画廊有很多图像,属于一本书

belongs_to :books
has_many :images
accepts_nested_attributes_for :books
accepts_nested_attributes_for :images, :allow_destroy => true

//图库控制器

 class GalleriesController < ApplicationController
  before_action :set_gallery, only: [:show, :edit, :update, :destroy]

  def index
    @galleries = Gallery.all
  end

  def show
  end

  def new
    @gallery = Gallery.new
  end

  def edit
  end
  def create
    @gallery = Gallery.new(gallery_params)
  end

  def update
  end

  def destroy
    @gallery.destroy
  end

  private
    def set_gallery
      @gallery = Gallery.find(params[:id])
    end
    def gallery_params
      params.require(:gallery).permit(:name, :book_id)
    end
end

2)图片属于图库

belongs_to :gallery
    has_attached_file :file, :styles => { :medium => "300x300>", :thumb => "100x100>" }, :default_url => "/images/:style/missing.png"
    validates_attachment_content_type :file, :content_type => /\Aimage\/.*\Z/

//图像控制器

3)一本书有一个画廊

belongs_to :author
has_one :gallery

accepts_nested_attributes_for :author
accepts_nested_attributes_for :gallery

的Gemfile:

gem 'simple_form'
gem 'nested_form'

在图库的表单中,我有simple_fields_for,我在那里生成了表单字段,用于上传图片,因为这些需要多个金额来创建图库,如下所示:

<%= simple_form_for(@gallery, html: { multipart: true }) do |f| %>
  <%= f.error_notification %>

  <div class="inputs">
    <%= f.input :name %>
    <%= f.input :book_id %>
    <%= f.simple_fields_for :image do |a| %>
        <%#= f.input :picture %>
        <%#= a.file_field :file %>
        <%= f.input_field :file, as: :file, multiple: true, name: 'gallery[image]' %>
    <% end %>
  </div>

  <div class="actions">
    <%= f.button :submit %>
  </div>
<% end %>

然后在我创建书籍的书籍表格中,我有一个表格,我想要嵌套图库表格,这样我就可以为每本书籍创作添加一个图库。出于某种原因,它似乎不起作用,我一直在收到错误:

undefined method `simple_nested_form_for' for #<SimpleForm::FormBuilder:0x00000104d52640

表格如下。

<%= simple_form_for(@book, :html => { :multipart => true }) do |f| %>    
<%= f.simple_nested_form_for (@gallery) do |t| %>
    <%= t.simple_fields_for :gallery do |t| %>
    <%= render 'galleries/form' %>
    <% end %>
    <% end %>
<% end %>

这些错误似乎是由于它没有找到该方法,我已经重启服务器两次而且我仍然得到相同的错误。

我遇到的问题是将图书馆放在书本中,以便我可以创作这本书。

1 个答案:

答案 0 :(得分:1)

您正在尝试在表单中包含表单。即<%= simple_form_for(@gallery, html: { multipart: true }) do |f| %>下有<%= simple_form_for(@book, :html => { :multipart => true }) do |f| %>

您一次只能拥有一个表单实例。其他应该像<%= t.simple_fields_for :xyz do |t| %>

请从您的图库表单中删除<%= simple_form_for(@gallery, html: { multipart: true }) do |f| %>。如果您需要任何其他帮助,可以关注嵌套表单的ryan railscast。 http://railscasts.com/episodes/196-nested-model-form-part-1&amp; http://railscasts.com/episodes/197-nested-model-form-part-2

对于嵌套模式下的简单表单,请按https://github.com/plataformatec/simple_form/wiki/Nested-Models