ruby-on-rails - 从一个控制器调用 Rails 5 动作到另一个控制器
问题描述
我正在创建一个具有用户和帐户的应用程序。我的问题是我首先创建了用户模型和身份验证功能,但后来意识到我需要让用户属于帐户。
如果我在路由上注册了一个用户,http://lvh.me:3000/signup
它将创建一个新用户,发送一封激活电子邮件并激活一个用户。效果很好,只是它不会创建Account
. 但是现在,我需要account
在混合中添加一个。如果我在我的新路由上注册http://lvh.me:3000/accounts/new
,它将创建帐户和用户,但我需要发送激活电子邮件,以便我可以实际激活用户。我似乎无法让我的Account
控制器触发我内部@user.send_activation_email
的操作- 请参见下面的代码。我知道我在下面的方式不是正确的方式,但我已经碰到了一堵砖墙,不知道从这里去哪里。create
UserController
用户.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
...
帐号.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
account_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
...
解决方案
如果您需要将两个模型都创建为注册流程的一部分,则在单个控制器中执行一个操作来触发您的注册流程并创建两个记录。
您可以通过多种方式实现这一点,例如让Users#signup
操作在事务中创建用户和帐户,或者您可以将该逻辑移出控制器并进入模型层并提供User.signup
显式创建帐户的方法或在after_create
回调中。
无论哪种方式,这里的解决方法是简化和统一您的注册流程,而不是将其拆分到多个控制器中。仅当您有某种多步骤注册要求用户在步骤之间执行某些操作时,您才需要这样做。
推荐阅读
- java - 带有 Java 代码的 HTML 中的 IF 条件是跳过所有 HTML 代码并给出 NULL POINTER
- c# - C# 更改背景颜色标题
- jquery - Shopify 使用 api 更新客户标签
- python - 有没有办法获取您使用 Pixabay 搜索的图像并使用 discord.py 发送它?
- winapi - MFC:CBitmapCreateCompatibleBitmap() 根据传递给它的两个兼容 CDC 给出不同的结果?
- bash - 将字符串转换为日期并与文件创建时间进行比较
- html - Bootstrap删除按钮左侧的空间
- python - 跳过前 48 行后用 python 的 Pandas 逐行读取
- java - 如何将 Git 存储库和 Maven 依赖项导入 Eclipse?
- reactjs - 如何使用打字稿在功能组件中使用渲染道具