Rails4、添加没有嵌套属性的动态字段
Rails 4, add dynamic fields without nested attributes
我目前遇到了一个问题,我正在尝试添加动态字段,并且它有效,但是我需要为在该字段上动态生成的嵌套属性创建第二个模型。
我有一个非常简单的表单,它要求输入用户名,我希望能够允许用户单击一个按钮 ("Add additional name") 并动态添加该字段,然后添加另一个名称.我可以只使用一个模型和控制器,而不使用嵌套表单吗?
这是我目前拥有的,但我不希望它以这种方式工作:
控制器
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
所以理想情况下,我想使用一个模型,并允许输入完全相同属性的其他字段,这意味着如果我有名称:字段,我应该能够单击 "Add another name" 并添加那个名字,这将作为单独的客人保存在 table 中,这意味着第一位客人的 guest_id 为 1,而为另一位客人动态添加的字段将添加一个 [=31] 的客人=] 共 2 个
我认为您认为控制器和模型之间必须存在一对一的关系是错误的。看看 ActiveRecord's Nested Attributes。这表明您可以在一个操作中让单个表单向对象及其子对象提交数据。
查看 fields_for,了解有关如何配置表单以允许您为子对象输入数据的信息。
当我使用嵌套集时,我发现使用像 dynatree is the best way to display the nested data to users. I've also created a gem TreeDecorator 这样的 JavaScript 工具可以轻松地将嵌套集呈现为嵌套 HTML 列表,然后可以将其传递给dynatree。
我设法找到了一个解决方案,它允许我保留我的嵌套属性并且仍然能够在索引页中显示相关的子元素。
这就是我为了让与 guest_id 相关的加号显示在 index.html.erb
中所做的
<% @guest.each do |guest| %>
<% guest.plusones.each do |plus| %>
<%= plus.name %>
<%= plus.oldness %>
<% end %>
<% end %>
我目前遇到了一个问题,我正在尝试添加动态字段,并且它有效,但是我需要为在该字段上动态生成的嵌套属性创建第二个模型。
我有一个非常简单的表单,它要求输入用户名,我希望能够允许用户单击一个按钮 ("Add additional name") 并动态添加该字段,然后添加另一个名称.我可以只使用一个模型和控制器,而不使用嵌套表单吗?
这是我目前拥有的,但我不希望它以这种方式工作:
控制器
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
所以理想情况下,我想使用一个模型,并允许输入完全相同属性的其他字段,这意味着如果我有名称:字段,我应该能够单击 "Add another name" 并添加那个名字,这将作为单独的客人保存在 table 中,这意味着第一位客人的 guest_id 为 1,而为另一位客人动态添加的字段将添加一个 [=31] 的客人=] 共 2 个
我认为您认为控制器和模型之间必须存在一对一的关系是错误的。看看 ActiveRecord's Nested Attributes。这表明您可以在一个操作中让单个表单向对象及其子对象提交数据。
查看 fields_for,了解有关如何配置表单以允许您为子对象输入数据的信息。
当我使用嵌套集时,我发现使用像 dynatree is the best way to display the nested data to users. I've also created a gem TreeDecorator 这样的 JavaScript 工具可以轻松地将嵌套集呈现为嵌套 HTML 列表,然后可以将其传递给dynatree。
我设法找到了一个解决方案,它允许我保留我的嵌套属性并且仍然能够在索引页中显示相关的子元素。
这就是我为了让与 guest_id 相关的加号显示在 index.html.erb
中所做的<% @guest.each do |guest| %>
<% guest.plusones.each do |plus| %>
<%= plus.name %>
<%= plus.oldness %>
<% end %>
<% end %>