【问题标题】:Rails 4, add dynamic fields without nested attributesRails 4,添加没有嵌套属性的动态字段
【发布时间】:2015-03-20 06:26:22
【问题描述】:

我目前遇到一个问题,我正在尝试添加动态字段,并且它可以工作,但是我需要为在字段上动态生成的嵌套属性创建第二个模型。

我有一个非常简单的表单,它要求输入用户名,我希望能够允许用户单击一个按钮(“添加其他名称”)并动态添加该字段,然后添加另一个名称。我可以只使用一个模型和控制器,而不使用嵌套表单吗?

这是我目前拥有的,但我不希望它以这种方式工作:

控制器

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

所以理想情况下,我想使用一个模型,并允许输入具有完全相同属性的其他字段,这意味着如果我有一个名称:字段,我应该能够单击“添加另一个名称”并添加该名称,这将在表中保存为单个客人,这意味着第一个客人的 guest_id 为 1,而为另一个客人动态添加的字段将添加一个 guest_id 为 2 的客人。

【问题讨论】:

  • 你尝试过什么?请发布您的相关代码。

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


【解决方案1】:

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

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

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

【讨论】:

  • ReggieB,我正在使用 ActionForm 使用嵌套表单和属性。我需要显示来宾及其 Plusone(附加来宾),因此 Plusone 与 guest_id 相关。所以 www.domain.com/guests/1 将显示 Guest 和 Plusones for Guest 的 id 为 1,但是我需要在索引方法(页面)上的表格中显示所有来宾及其关系 plusones。 @Musad
  • 那么我认为您想使用 JavaScript 将节目(和其他操作)动态拉入索引视图。如果是我,我会使用 AngularJS 在前端添加功能,并在后端使用 rails 处理 AJAX 调用。
  • 所以没有办法使用单个控制器而只添加一个额外的字段而不使用嵌套字段,我希望用户输入一个名称,然后动态添加一个字段以添加另一个名称?
【解决方案2】:

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

这就是我所做的让与 guest_id 相关的 plusones 显示在 index.html.erb 中

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-25
    • 2016-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多