Создание объектов Rails для двух моделей из одного действия контроллера - PullRequest
0 голосов
/ 08 мая 2020

Я пытаюсь создать поток, в котором пользователь может просмотреть обзор / описание информационного бюллетеня, а затем заполнить форму со своим адресом электронной почты и подписаться. В частности, потенциальный подписчик должен:

  • перейти к newsletters/:id/overview и увидеть обзор информационного бюллетеня
  • Заполнить форму своим адресом электронной почты и подписаться
  • И тогда будут созданы новые Subscriber (id, email) и новые Subscription (id, subscriber_id, newsletter_id).

Учитывая, что этот поток пересекает три разные модели, я пытаюсь выяснить «правильный / лучший» способ создания Subscriber и Subscription. Я застрял в том, что сейчас у меня есть запрос из формы на действие newsletter#subscribe, но сейчас мне интересно, должен ли я:

  • Создать подписчика и подписку напрямую внутри метода
  • Вызов методов subscriber#create и subscription#create (из того, что я читал, вызывать действия через контроллеры не рекомендуется)
  • Создание модулей для создания подписчика и подписка (не делал этого раньше, но несколько потоков Stackoverflow обсуждают это)
  • Вместо этого используйте запрос формы go на subscriber#create действие
  • Или что-то еще?

Вот некоторые файлы:

информационные бюллетени / обзор. html .erb

<h2>Subscribe:</h2>
<%= form_with scope: :subscriber, url: newsletter_subscribe_path do |form| %>
  <p>
    <%= form.label :email %><br>
    <%= form.text_field :email %>
  </p>
  <p>
    <%= form.submit %>
  </p>
<% end %>

newsletters_controller.rb

class NewslettersController < ApplicationController
  def subscribe
    # ???
  end
end

Одно примечание: В настоящее время у меня нет маршрутов subscription, вложенных в subscriber или newsletter, поскольку они относятся к обоим. Я не уверен, упростит ли это изменение.

РЕДАКТИРОВАТЬ:

newsletter.rb

class Newsletter < ApplicationRecord
    belongs_to :publisher
    has_many :posts
    has_many :subscriptions
end

subscriber.rb

class Subscriber < ApplicationRecord
    has_many :subscriptions
end

subscription.rb

class Subscription < ApplicationRecord
  belongs_to :subscriber
  belongs_to :newsletter
end

1 Ответ

1 голос
/ 09 мая 2020

Варианты 1 и 3 достаточно хороши, определенно не вариант 2. Я бы предложил создать файл службы subscription_service.rb в качестве формы для практики использования служебных модулей в Rails.

Если вы желая добавить еще один вариант, вы можете выполнить создание Subscription в обратном вызове after_create в модели Subscriber. Обратите внимание, что вам необходимо передать виртуальный атрибут в модель Subscriber (в данном случае newsletter_id), чтобы у вас был доступ к нему в вашей модели.

subscriber.rb

class Subscriber < ApplicationRecord
  has_many :subscriptions

  attr_accessor :newsletter_id

  after_create :create_subscription

  def create_subscription
    Subscription.create(subscriber_id: id, newsletter_id: newsletter_id)
  end
end

newsletters_controller.rb

class NewslettersController < ApplicationController
  def subscribe
    @subscriber = Subscriber.create(subscriber_params)
  end

  private

  def subscriber_params
    params.require(:subscriber).permit(:email, :newsletter_id)
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...