【问题标题】:fields_for not saving nested parameters in rails 5.0.1fields_for 不在 Rails 5.0.1 中保存嵌套参数
【发布时间】:2017-04-11 01:58:39
【问题描述】:

我对 Rails 还很陌生,虽然我已经制作了一些基本的应用程序并阅读了一些教程,但这是我第一次深入研究表单中的嵌套属性和 fields_for 的使用。

我已经搜索了许多类似的问题并阅读了有关 fields_for 的文档,但是每当我在表单中使用 fields_for 时,我的表单似乎并没有保存。我已经在没有 fields_for 的情况下进行了测试,并按应有的方式保存(显然没有保存到嵌套数据库中)。

我正在尝试做的是一个简单的事件注册,它又在一个单独的模型中具有一些属性和一个日期。

我尝试过验证和不验证,强参数中有很多不同的东西

这是我的事件模型:

class Event < ApplicationRecord
  has_many :eventdates, dependent: :destroy
  accepts_nested_attributes_for :eventdates

  validates :name, :description, :city, :street, :postal_code, presence: true

end

Eventdate 模型:

class Eventdate < ApplicationRecord
  belongs_to :event

  validates :date, :start_hour, :finish_hour, :event_id, presence: true
end

事件控制器:

class EventsController < ApplicationController

  def new
    @event = Event.new
    @event.eventdates.build
  end

  def create
    @event = Event.new(event_params)
    if @event.save
      redirect_to root_url
    else
      render "static_pages/home"
    end
  end

  private

    def event_params
      params.require(:event).permit(:name, :description, :street, :city, :postal_code, :address_number, :additional_info, 
      eventdates_attributes: [:id, :date, :start_hour, :finish_hour, :event_id])
    end

还有形式:

<%= form_for(@event, url: events_path) do |f| %>
  <p>
    <%= f.label :nombre %>
    <%= f.text_field :name %>
  </p>

  <div>
    <%= f.fields_for :eventdates do |eventdate_fields| %>

      <%= eventdate_fields.label :fecha %>
      <%= eventdate_fields.date_field :date %>

      <%= eventdate_fields.label :hora_de_inicio %>
      <%= eventdate_fields.time_field :start_hour %>

      <%= eventdate_fields.label :hora_de_termino %>
      <%= eventdate_fields.time_field :finish_hour %>
    <% end %>
  </div>

  <p>
  <%= f.label :infomación_adicional %>
  <%= f.text_area :additional_info %>
  </p>

  <p>
    <%= f.submit "Crear evento" %>
  </p>
<% end %>

我很确定这是一个非常简单的表单,但不知何故根本拒绝保存到数据库中。

【问题讨论】:

    标签: nested save ruby-on-rails-5 fields-for


    【解决方案1】:

    eventdate.rb 模型中,将optional: true 附加到此行:belongs_to :event

    class Eventdate < ApplicationRecord
      belongs_to :event, optional: true
    
      validates :date, :start_hour, :finish_hour, :event_id, presence: true
    end
    

    因为 Rails 将首先创建 eventdates,然后创建 event 并链接到这些 evendates(通过更新这些 evendates 中的所有 event_id)。但是在创建eventdates时,event_id列是nileventdates无法保存。

    【讨论】:

    • 很遗憾不是这样,但您的回答让我对表单如何处理事情有了更好的理解,所以我会尝试更改验证等以及您的回答。
    • 我编辑了 eventdate 验证,现在可以完美运行,非常感谢。
    • 不客气。我通常将debugger 放在create 操作中以找出答案。你以前试过吗?
    • @Bluespheal 你能把代码贴在它工作的地方吗?谢谢
    • @VinitGaikwad 我认为@Bluespheal 在当前验证中删除了:event_id
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多