Вызов действия Rails 5 от одного контроллера к другому - PullRequest
0 голосов
/ 25 мая 2018

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

Если я зарегистрирую пользователя на маршруте http://lvh.me:3000/signup, он создаст нового пользователя, отправитАктивация электронной почты и активация пользователя.Прекрасно работает, за исключением того, что не создает Account.Но теперь мне нужно добавить account в микс.Если я зарегистрируюсь по моему новому маршруту http://lvh.me:3000/accounts/new, это создаст учетную запись и пользователя, но мне нужно отправить электронное письмо для активации, чтобы я мог фактически активировать пользователя.Я не могу заставить свой контроллер Account вызвать @user.send_activation_email в действии create внутри моего UserController - см. Код ниже.Я знаю, что то, что у меня есть ниже, не является правильным, но я ударился о кирпичную стену и не уверен, куда идти.

user.rb

class User < ApplicationRecord
  has_many :memberships
  has_many :accounts, through: :memberships
  accepts_nested_attributes_for :accounts
  ...
   # Sends activation email.
  def send_activation_email
    UserMailer.account_activation(self).deliver_now
  end
  ...

account.rb

class Account < ActiveRecord::Base
  belongs_to :owner, class_name: 'User'
  accepts_nested_attributes_for :owner

  has_many :memberships
  has_many :users, through: :memberships
end

accounts_controller.rb

class AccountsController < ApplicationController

  def new
    @account = Account.new
    @account.build_owner
  end

  def create
    @account = Account.new(account_params)
    if @account.save
      @user.send_activation_email
      flash[:info] = 'Please check your email to activate your account.' # Use this for registered users
      # flash[:info] = 'Please have user check their email to activate their account.' # Use this for admin created users
      redirect_to root_url
    else
      flash.now[:alert] = 'Sorry, your account could not be created.'
      render :new
    end
  end

  private

  def account_params
    params.require(:account).permit(:organization, owner_attributes: [:name, :email, :password, :password_confirmation])
  end
end

users_controller.rb

class UsersController < ApplicationController
   ...
    def create
    @user = User.new(user_params)
    if @user.save
      @user.send_activation_email
      flash[:info] = 'Please check your email to activate your account.' # Use this for registered users
      # flash[:info] = 'Please have user check their email to activate their account.' # Use this for admin created users
      redirect_to root_url
    else
      render 'new'
    end
  end
  ...
  def user_params
    params.require(:user).permit(:name, :email, :password, :password_confirmation, accounts_attributes: [:organization])
  end
  ...

1 Ответ

0 голосов
/ 25 мая 2018

Если вам нужны обе модели, созданные как часть потока регистрации, то выполните одно действие в одном контроллере, которое запускает ваш поток регистрации и создает обе записи.

Это можно реализовать несколькими способами.например, действие Users#signup создает пользователя и учетную запись внутри транзакции, или вы можете переместить эту логику из контроллера в уровень модели и предоставить метод User.signup, который создает учетную запись явно или в after_create callback.

В любом случае, здесь исправлено упрощение и унификация потока регистрации, а не разделение его на несколько контроллеров.Это нужно делать только в том случае, если у вас есть какая-то многоэтапная регистрация, требующая от пользователя выполнения некоторых действий между шагами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...