2014-05-01 89 views
1

我有一個惡夢,試圖將用戶數據種入我的rails項目。我使用Nitrous.io,我能夠通過打字來建立一個新的用戶以下到控制檯Rails db:seed「rake aborted!ArgumentError:參數數量錯誤(0代表2)」

rails console 

然後在控制檯執行以下

2.1.1 :001 > u = User.new                                        
=> #<User id: nil, username: nil, email: nil, password_hash: nil, password_salt: nil, admin: nil, points: nil, leagues: nil>               
2.1.1 :002 > u.username = 'testadmin' 
=> "testadmin"                                          
2.1.1 :003 > u.email = '[email protected]'                                   
=> "[email protected]"                                        
2.1.1 :004 > u.password = 'test'                                      
=> "test" 
2.1.1 :005 > u.password_confirmation = 'test'                                   
=> "test"                                            
2.1.1 :006 > u.admin = true                                       
=> true                                            
2.1.1 :007 > u.save 
    (86.8ms) BEGIN                                          
User Exists (87.5ms) SELECT 1 AS one FROM "users" WHERE "users"."email" = '[email protected]' LIMIT 1                   
User Exists (86.6ms) SELECT 1 AS one FROM "users" WHERE "users"."username" = 'testadmin' LIMIT 1                     
SQL (91.7ms) INSERT INTO "users" ("admin", "email", "password_hash", "password_salt", "username") VALUES ($1, $2, $3, $4, $5) RETURNING "id" [["admin", "t"], ["email", "testAdmin @test.com"], ["password_hash", "$2a$10$tVMzM58wjt.lDG6dlsoLQe4obwYzLf3UfUc2ui6MD2eTGAgwTTaQK"], ["password_salt", "$2a$10$tVMzM58wjt.lDG6dlsoLQe"], ["username", "testadmin"]]   
(89.3ms) COMMIT                                         
=> true                                            
2.1.1 :008 > Exit 

於是我去在控制檯種​​子,但出現以下錯誤:在項目我seeds.rb文件並輸入以下

User.create ({username: 'testadmin2', email: '[email protected]', password: 'test', password_confirmation: 'test', admin: true}) 

我然後運行耙分貝

rake aborted!                                           
ArgumentError: wrong number of arguments (2 for 0..1)                                 
/home/action/workspace/PAW/app/models/user.rb:39:in `initialize'                              
/home/action/.rvm/gems/ruby-2.1.1/gems/activerecord-4.1.0/lib/active_record/inheritance.rb:30:in `new'                     
/home/action/.rvm/gems/ruby-2.1.1/gems/activerecord-4.1.0/lib/active_record/inheritance.rb:30:in `new'                     
/home/action/.rvm/gems/ruby-2.1.1/gems/protected_attributes-1.0.7/lib/active_record/mass_assignment_security/persistence.rb:45:in `create'            
/home/action/workspace/PAW/db/seeds.rb:8:in `<top (required)>' 
/home/action/.rvm/gems/ruby-2.1.1/gems/activesupport-4.1.0/lib/active_support/dependencies.rb:241:in `load'                   
/home/action/.rvm/gems/ruby-2.1.1/gems/activesupport-4.1.0/lib/active_support/dependencies.rb:241:in `block in load'                 
/home/action/.rvm/gems/ruby-2.1.1/gems/activesupport-4.1.0/lib/active_support/dependencies.rb:232:in `load_dependency'                 
/home/action/.rvm/gems/ruby-2.1.1/gems/activesupport-4.1.0/lib/active_support/dependencies.rb:241:in `load'                   
/home/action/.rvm/gems/ruby-2.1.1/gems/railties-4.1.0/lib/rails/engine.rb:543:in `load_seed'  
/home/action/.rvm/gems/ruby-2.1.1/gems/activerecord-4.1.0/lib/active_record/tasks/database_tasks.rb:184:in `load_seed'                 
/home/action/.rvm/gems/ruby-2.1.1/gems/activerecord-4.1.0/lib/active_record/railties/databases.rake:173:in `block (2 levels) in <top (required)>'          
Tasks: TOP => db:seed                                         
(See full trace by running task with --trace) 

我是新來的紅寶石和鐵軌,所以我可能做一些愚蠢的事情,但我已經在最後兩個小時了,我根本找不到它。我想爲此種子數據的原因是因爲我想設置一些可以訪問某些頁面的管理員(所有頁面都可以正常工作)。爲此,我需要設置admin = true。如果我通過網站設置新用戶,我無法選擇將用戶設置爲管理員。我可以通過上面的控制檯來完成,但它需要很長時間。播種會更快,我也想知道我做錯了什麼。我會在下面給你一些其他的代碼。爲尋找(並希望幫助)

user.rb

class User < ActiveRecord::Base 
    attr_accessible :email, :username, :password, :password_confirmation 
    attr_accessor :password 
    before_save :encrypt_password 

    validates_confirmation_of :password 
    validates_presence_of :password, :on => :create 
    validates_presence_of :email, :on => :create 
    validates_presence_of :username, :on => :create 
    validates_uniqueness_of :email 
    validates_uniqueness_of :username 

    def self.authenticate_by_email(email, password) 
     user = find_by_email(email) 
     if user && user.password_hash == BCrypt::Engine.hash_secret(password, user.password_salt) 
     user 
     else 
     nil 
     end 
    end 

    def self.authenticate_by_username(username, password) 
     user = find_by_username(username) 
     if user && user.password_hash == BCrypt::Engine.hash_secret(password, user.password_salt) 
     user 
     else 
     nil 
     end 
    end 

    def encrypt_password 
     if password.present? 
     self.password_salt = BCrypt::Engine.generate_salt 
     self.password_hash = BCrypt::Engine.hash_secret(password, password_salt) 
     end 
    end 

    def initialize(attributes = {}) 
     super # must allow the active record to initialize! 
     attributes.each do |name, value| 
     send("#{name}=", value) 
     end 
    end  
    end 

authentication_controller.rb

class AuthenticationController < ApplicationController 
    def sign_in 
     @user = User.new 
    end 

    def login 
     username_or_email = params[:user][:username] 
     password = params[:user][:password] 

     if username_or_email.rindex('@') 
     email=username_or_email 
     user = User.authenticate_by_email(email, password) 
     else 
     username=username_or_email 
     user = User.authenticate_by_username(username, password) 
     end 

     if user 
     session[:user_id] = user.id 
     flash[:notice] = 'Welcome' 
     redirect_to :root 
     else 
     flash.now[:error] = 'Unknown user. Please check your username and password.' 

     # Assign user to instance variable for the `sign_in` view! 
     @user = User.new(params[:user]) 

     render :action => "sign_in" 
     end 
    end 

    def signed_out 
     session[:user_id] = nil 
     flash[:notice] = "You have been signed out." 
    end 

    def new_user 
     @user = User.new 
    end 

    def register 
     @user = User.new(params[:user]) 

     if @user.valid? 
     @user.save 
     session[:user_id] = @user.id 
     flash[:notice] = 'Welcome.' 
     redirect_to :root 
     else 
     render :action => "new_user" 
     end 
    end 

    end 

Question now answered. See below.

回答

3
  1. 不模型做到這一點感謝(User.rb

    def initialize(attributes = {}) 
        super # must allow the active record to initialize! 
        attributes.each do |name, value| 
        send("#{name}=", value) 
    end 
    end 
    

    這不是R equired。 Rails自動創建getter和setter方法。

  2. 而且,雖然創建記錄與create,沒有必要包裝參數與{}

相關問題