【问题标题】:When @User is activated create an Object that belongs to that User当@User 被激活时,创建一个属于该用户的对象
【发布时间】: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

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

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

  2. 我是否正确地处理了这个问题?我应该从代码中的其他地方触发创建默认类别和画廊吗?我读过一些关于 .change? 的内容,我尝试在 User 的 activated 列上使用它,但我不知道如何使用它。

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

【问题讨论】:

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


    【解决方案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 并检查 user.activated_changed? &amp;&amp; user.activated?,然后生成那里的通用类别和画廊。

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

    【讨论】:

      【解决方案2】:

      我发现我做错了什么。我试图创建类别/数组而不是类别/单个对象。我转了这个:

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

      到这里:

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

      【讨论】:

        猜你喜欢
        • 2011-10-08
        • 2018-11-02
        • 1970-01-01
        • 1970-01-01
        • 2021-11-29
        • 2015-08-01
        • 2019-12-27
        • 2010-10-08
        • 2013-05-31
        相关资源
        最近更新 更多