Rails 4,添加没有嵌套属性的动态字段

时间:2015-03-20 06:26:23

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

我目前坐在一个问题,我正在尝试添加动态字段,但它确实有效,但是我需要为在该字段上动态生成的嵌套属性创建第二个模型。

我有一个非常简单易用的表单,询问用户的名字,我希望能够允许用户点击一个按钮("添加其他名称")并拥有该名称动态添加字段然后添加另一个名称。我是否可以仅使用一个模型和控制器,而不使用嵌套表单?

这就是我现在所拥有的,但我不希望它以这种方式运作:

控制器

class GuestsController < ApplicationController
skip_before_filter :authenticate_user!, only: [:new, :create]

  def index
    @guest = Guest.all
  end

  def new
    guest = Guest.new
    @guest_form = GuestForm.new(guest)
  end

  def show
    @guest = Guest.find(params[:id])
  end

  def create
    guest = Guest.new
    @guest_form = GuestForm.new(guest)
    @guest_form.submit(guest_params)

    if @guest_form.save
      respond_to do |format|
        format.html { redirect_to :back, notice: 'Thank you for replying' }
        format.js
      end
    else
      respond_to do |format|
        format.html { render :new }
        format.js
      end
    end
  end

  def destroy
    @guest = Guest.find(params[:id])
    @guest.destroy
    redirect_to guests_path
  end

private

  def guest_params
    params.require(:guest).permit(:status, :name, :message, plusones_attributes: [:id, :name, :oldness, :_destroy])
  end

end

型号:

class Guest < ActiveRecord::Base
  has_many :plusones, dependent: :destroy
  belongs_to :user
end

class Plusone < ActiveRecord::Base
  belongs_to :guest
end

理想情况下,我想使用一个Model,并允许输入完全相同属性的其他字段,这意味着如果我有一个Name:字段,我应该可以点击&#34;添加另一个名字&#34 ;并添加该名称,并将其保存为表中的单个guest虚拟机,这意味着第一个guest虚拟机的guest_id为1,而另一个guest虚拟机的动态添加字段将添加guest_id为2的guest虚拟机。

2 个答案:

答案 0 :(得分:0)

我认为你错误地认为控制器和模型之间必须存在一对一的关系。看看ActiveRecord's Nested Attributes。这表明您可以在一个操作中将一个表单提交给一个对象及其子对象。

查看fields_for,了解有关如何配置表单以允许您输入子对象数据的信息。

当我使用嵌套集时,我发现使用像dynatree之类的JavaScript工具是向用户显示嵌套数据的最佳方式。我还创建了一个gem TreeDecorator,以便将嵌套集渲染为嵌套HTML列表,然后可以将其传递给dynatree。

答案 1 :(得分:0)

我设法找到一个解决方案,允许我保留我的嵌套属性,并且仍然能够在索引页面中显示相关的子元素。

我这样做是为了让与guest_id相关的plusone在index.html.erb中显示

<% @guest.each do |guest| %>
  <% guest.plusones.each do |plus| %>
    <%= plus.name %>
    <%= plus.oldness %>
  <% end %>
<% end %>