我目前坐在一个问题,我正在尝试添加动态字段,但它确实有效,但是我需要为在该字段上动态生成的嵌套属性创建第二个模型。
我有一个非常简单易用的表单,询问用户的名字,我希望能够允许用户点击一个按钮("添加其他名称")并拥有该名称动态添加字段然后添加另一个名称。我是否可以仅使用一个模型和控制器,而不使用嵌套表单?
这就是我现在所拥有的,但我不希望它以这种方式运作:
控制器
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虚拟机。
答案 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 %>