簡體   English   中英

Rails has_one和accepts_nested_attributes_for

[英]Rails has_one and accepts_nested_attributes_for

我似乎無法通過accepts_nested_attributes_for獲得has_one關系。 這是我第一次嘗試嵌套屬性,因此可能不正確。 救命!

楷模:

class Case < ActiveRecord::Base
  has_one :logged_event, class_name: 'Event', dependent: :destroy
  accepts_nested_attributes_for :logged_event
end

class Event < ActiveRecord::Base
  belongs_to :case
  belongs_to :user
  validates :case, presence: true
  validates :user, presence: true
end

控制器:

class CasesController < ApplicationController
  load_and_authorize_resource

  def new
    @case.build_logged_event(user: current_user)
  end

  def create
    if @case.save
      flash[:notice] = 'Case was successfully logged.'
      redirect_to cases_path
    else
      render 'cases/new'
    end
  end
end

形成:

<h1>New Case</h1>
<%= error_messages_for :case %>
<%= form_for(@case) do |form| %>
  <p>
    <%= form.label(:study) %>:
    <%= form.select(:study, Case.options_for(:study), include_blank: true) %>
  </p>
  <%= form.fields_for(:logged_event) do |logged_event_form| %>
    <%= logged_event_form.label(:created_at, 'Date Case was opened:') %>
    <%= logged_event_form.select(:created_at, [['Today', Date.today], ['Yesterday', Date.yesterday]]) %>
  <% end %>    
  <%= form.submit('Log Case') %> or <%= link_to('cancel', cases_path) %>
<% end %>

就是說,記錄的事件沒有獲得用戶ID或案例ID,因此對事件類的兩次驗證均失敗。 看起來像:

以下字段存在問題:
記錄的事件大小寫不能為空
記錄的事件用戶不能為空

我不明白,因為在新動作中我已經建立了對象。 我也嘗試了form.fields_for(:logged_event, @case.logged_event)但這也不起作用。

這是因為提交表單時未調用new create操作正在運行。 因此, @case僅使用提交數據填充; 沒有用戶或案例分配給它,因為它不在表單中。

您需要先分配@caseusercase屬性, @case再嘗試保存(並運行驗證)

事實證明,您不應該兩面驗證。 我正在驗證一個案例有一個事件,一個事件有一個案例。 通過刪除validates :case, presence: true就像事件一樣,一切都會按預期進行。

您不需要刪除驗證-您只需要在關聯聲明中添加inverse_of即可告訴Rails為您管理反向引用。

您的模型應如下所示:

class Case < ActiveRecord::Base
  has_one :logged_event, class_name: 'Event', dependent: :destroy, inverse_of: :case
  accepts_nested_attributes_for :logged_event
end

class Event < ActiveRecord::Base
  belongs_to :case, inverse_of: :logged_event
  belongs_to :user, inverse_of: :logged_event # or inverse_of: :event -- you didn't provide your User model
  validates :case, presence: true
  validates :user, presence: true
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM