激活@User时,创建属于该用户

时间:2016-08-22 18:37:41

标签: ruby-on-rails ruby-on-rails-4 object model-view-controller programmatically-created

我有一个用户模型,它有许多画廊和类别(两个独立的模型,属于:用户)。我想创建一个名为“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

我的问题是,在创建用户时,“Everything”类别不是,我收到以下错误,我无法调和:

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

我有几个与我的问题相关的问题:

  1. 第一个是最明显的,为什么我得到nomethod错误,似乎没有与类别相关的'each'方法?

  2. 我是否正确处理此问题?我应该从代码中的其他位置触发创建默认类别和库吗?我已经阅读了一些关于.change?我尝试在用户的activated列上使用的内容,但我不知道如何使用它。

  3. 非常感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分:1)

您正尝试将user.categories.build(name: 'Everything')的结果分配给user.categoriesuser.categories.build(name: 'Everything')会在其上创建新记录。您无需进一步将其分配给user.categories。试图这样做会导致Rails迭代user.categories.build(name: 'Everything')的结果,这是一个Category,而不是一个集合。

因此,问题1的解决方案是替换:

user.categories = user.categories.build(name: 'Everything')

使用:

user.categories.build(name: 'Everything')

问题2的答案取决于用户可以激活多少个不同的地方和/或方式。如果控制器激活操作是唯一的地方,那么您的解决方案可能没问题。但是如果你想以另一种方式激活用户(例如,从控制台),你可能最好在User上使用ActiveRecord回调,例如:after_save并检查{{ 1}},然后在那里生成通用类别和库。

在任何一种情况下,您可能需要考虑在创建之前检查用户的通用类别和图库是否已经存在(如果它们曾被激活然后停用)。

答案 1 :(得分:0)

我弄清楚我做错了什么。我试图创建类别/数组而不是类别/单个对象。我转过身来:

user.categories = user.categories.build(name: 'Everything')

到此:

user.categories << user.categories.create(name: 'Everything')