【发布时间】:2016-12-29 10:00:04
【问题描述】:
我有一个包含许多画廊和类别的用户模型(两个单独的模型属于_to :user)。我想创建一个名为“Everything”的默认类别和一个名为“Everything”的默认画廊。
我正在为我的应用改编 Mike Hartl 的教程,特别是用户创建和激活部分。因此,在使用此代码创建用户后:
User.rb
def create
@user = User.new(user_params)
if @user.save
@user.send_activation_email
flash[:info] = 'Please check your email to activate your account.'
redirect_to root_url
else
render 'new'
end
end
会向用户发送一封激活电子邮件,如果他们单击链接,它将激活他们的帐户。在激活时,activated 列从false 切换到true,我希望创建“Everything”图库和类别。在我看来,这是发生这种情况最合乎逻辑的地方,因为它可能只被触发一次。这样我就不必担心每次有人登录他们的帐户时都会尝试创建“Everything”类别和图库。
我尝试创建这些的方法是在激活帐户后立即插入以下代码:
user.categories = user.categories.build(name: 'Everything')
看起来像这样:
account_activations_controller.rb
class AccountActivationsController < ApplicationController
def edit
user = User.find_by(email: params[:email])
if user && !user.activated? && user.authenticated?(:activation, params[:id])
user.activate
user.categories = user.categories.build(name: 'Everything')
log_in user
flash[:success] = 'Account activated!'
redirect_to user
else
flash[:danger] = 'Invalid activation link'
redirect_to root_url
end
end
end
我的问题是,在创建用户时,“一切”类别不是,我收到以下错误,我无法协调:
NoMethodError at /account_activations/0hbg0T33tjQlleiwKqvUDg/edit
undefined method `each' for #<Category:0x00000004f95b60>
我不知道在这个过程中会在哪里调用“每个”。
虽然我提到了创建画廊和类别以及用户激活,但上面的代码仅针对类别。在我看来,如果我能让一个类别工作,我应该能够使用类似的解决方案让画廊工作。这就是我的类别创建操作的样子:
def new
@category = current_user.categories.build
end
def create
@category = current_user.categories.create(category_params)
if @category.save!
respond_to do |format|
format.html
format.js
end
end
end
我有几个与我的问题相关的问题:
第一个是最明显的,为什么我收到 nomethod 错误,似乎没有与类别关联的 'each' 方法?
我是否正确地处理了这个问题?我应该从代码中的其他地方触发创建默认类别和画廊吗?我读过一些关于
.change?的内容,我尝试在 User 的activated列上使用它,但我不知道如何使用它。
非常感谢您提供的任何帮助。
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-4 object model-view-controller programmatically-created