Как получить rails fields_for для создания новой ассоциации, если она не существует? - PullRequest
0 голосов
/ 08 сентября 2018

Я ссылаюсь на этот пост переполнения стека: Как получить Rails build и fields_for для создания только новой записи и не включать существующую?

В моем случае, у меня есть это:

<%= form.fields_for :campaign_schedule, @campaign.build_campaign_schedule do |campaign_schedule| %>

Если @campaign еще не имеет campaign_schedule, тогда создается новый campaign_schedule и отображаются поля text_fields в форме, чтобы пользователь мог предоставить данные для нового campaign schedule.

Однако, что если @campaign уже имеет существующий campaign_schedule? Я получаю сообщение об ошибке, используя эту форму fields_for, утверждая:

ActiveRecord :: RecordNotSaved (Не удалось удалить существующий связанный campaign_schedule. Запись не удалось сохранить после того, как ее внешний ключ был установлен на ноль.):

Я предполагаю, что это потому, что campaign_scheduled уже существует для @campaign, и он пытается построить новый.

Должен ли я просто пойти с чем-то вроде этого?

<% if @campaign.campaign_schedule.nil? %>
    <%= form.fields_for :campaign_schedule, @campaign.build_campaign_schedule do |campaign_schedule| %>
<% else %>
    <%= form.fields_for :campaign_schedule, do |campaign_schedule| %>
<% end %>

Или есть лучший способ сделать это? У меня в основном есть такие ассоциации:

#app/models/campaign.rb
class Campaign < ApplicationRecord
    has_one :campaign_schedule

    accepts_nested_attributes_for :campaign_schedule
end

и

#app/models/campaign_schedule.rb
class CampaignSchedule < ApplicationRecord
    belongs_to :campaign
end

EDIT

Похоже, мое условие if не будет работать в любом случае, потому что end для этого условия конфликтует с условием form.fields_for, поэтому оно не будет работать. Думаю, мне нужно выяснить, как манипулировать form.fields_for для создания ассоциации, только если она не существует.

1 Ответ

0 голосов
/ 08 сентября 2018

Я бы построил новое расписание кампании, если nil на действии контроллера:

def edit
  @campaign = Campaign.find(params[:id])
  @campaign.build_campaign_schedule unless @campaign.campaign_schedule
end

тогда вы должны быть в состоянии сделать:

<%= form.fields_for :campaign_schedule do |campaign_schedule| %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...