【问题标题】:Initializing "new users" in Rails在 Rails 中初始化“新用户”
【发布时间】:2010-04-26 11:30:30
【问题描述】:

我正在创建一个 Ruby on Rails 应用程序,并且正在尝试创建/登录/注销用户。

这是Users 的架构:

  create_table "users", :force => true do |t|
    t.string   "first_name"
    t.string   "last_name"
    t.text     "reputation"
    t.integer  "questions_asked"
    t.integer  "answers_given"
    t.string   "request"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.string   "email_hash"
    t.string   "username"
    t.string   "hashed_password"
    t.string   "salt"
  end

用户的个人信息(用户名、名字/姓氏、电子邮件)通过 POST 填充。其他如questions_askedreputation等都是应用程序设置的,所以在我们创建新用户的时候应该初始化。现在,我只是在create 方法中为UsersController 手动设置每一个:

  def create
    @user = User.new(params[:user])
    @user.reputation = 0
    @user.questions_asked = 0
    @user.answers_given = 0
    @user.request = nil
    ...
  end

有没有更优雅/更有效的方法来做到这一点?

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    params[:user] 只是一个哈希,您可以创建一个哈希并将其与参数合并,如

    def create
        params[:user].merge(
            { 
                :reputation => 0,
                :questions_asked => 0,
                :answers_given => 0
                ...
            }
        )
    
        @user = User.new(params[:user])
    end
    

    如果您想从控制器中删除该代码,您可以将其移动到您的模型中,然后添加一个 after_create 过滤器。

    但实际上,如果只是将其设置为 0,请在数据库列中设置默认值,您甚至不必在代码中处理它..

      create_table "users", :force => true do |t|
        t.string   "first_name"
        t.string   "last_name"
        t.text     "reputation", :default => 0
        t.integer  "questions_asked", :default => 0
        t.integer  "answers_given", :default => 0
        t.string   "request"
        t.datetime "created_at"
        t.datetime "updated_at"
        t.string   "email_hash"
        t.string   "username"
        t.string   "hashed_password"
        t.string   "salt"
      end
    

    如果您无法重做迁移,请使用 change_column_default 之类的

    class SetDefaultsOnUsers < ActiveRecord::Migration
      def self.up
         change_column_default "users", "reputation", 0
      end
    
      def self.down
         change_column_default "users", "reputation", default
      end
    end
    

    【讨论】:

      【解决方案2】:
      猜你喜欢
      • 1970-01-01
      • 2012-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-17
      • 1970-01-01
      相关资源
      最近更新 更多