2011-11-30 96 views
2

爲我的Ruby on Rails應用程序工作一個簡單的自定義驗證部分。我試圖在用戶嚮應用程序註冊時創建電子郵件,但當我嘗試註冊過程時,數據庫中創建了一條記錄,但電子郵件設置爲零。下面是一些代碼:Ruby on Rails - 字段設置爲無

我的模型:

class User < ActiveRecord::Base 
attr_accessor :email, :password, :password_confirmation 
before_save :encrypt 

validates :password, 
      :presence => true, 
      :confirmation => true 
validates :email, 
     :presence => true, 
     :uniqueness => true, 
     :format => { :with => /^[A-Za-z0-9._%+-][email protected][A-Za-z0-9.-]+\.[A-Za-z]{2,}\z$/ } 

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

def self.authenticate(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 
end 

我的控制器:

class UsersController < ApplicationController 
    skip_filter :login_required, :only => [:create, :new] 

    def new 
    @user = User.new 
    render :layout => 'unauthenticated' 
    end 

    def create 
    @user = User.new(params[:user]) 
    @user.last_login = DateTime.now 
    @user.is_active = true 

    if @user.save 
     session[:user_id] = @user.id 

     redirect_to root_url 
    else 
     render :action => :new 
    end 
    end 

end 

的觀點:

<div id="register"> 
    <%= form_for @user do |f| %> 
    <% if @user.errors.any? %> 
    <div class="error"> 
     <ul> 
     <% for message in @user.errors.full_messages %> 
     <li><%= message %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 
    <ul> 
     <li> 
     <%= f.label :email %> 
     <%= f.text_field :email %> 
     </li> 
     <li> 
     <%= f.label :password %> 
     <%= f.password_field :password %> 
     </li> 
     <li> 
     <%= f.label :password_confirmation %> 
     <%= f.password_field :password_confirmation %> 
     </li> 
     <li> 
     <%= f.submit 'Register' %> 
     </li> 
    </ul> 
    <% end %> 
</div> 

無論出於何種原因,該電子郵件被設爲零每次用戶已註冊。唯一看起來像處理電子郵件的是視圖上的字段和驗證,所以我不知道驗證是否可以剝離它並且不會拋出任何錯誤。

:login_required方法位於我的application_controller中,並且是一個檢查以確保用戶登錄進行會話。 skip_filter的目的是在登錄和註冊頁面時不檢查。

任何想法?提前致謝。

+0

在創建方法開始時檢查你的'params'變量。 –

回答

3

你寫的:

attr_accessor :email, :password, :password_confirmation 

你試過從這個列表中刪除的電子郵件參數?這可能會覆蓋AR對電子郵件屬性的持久性。您可能需要attr_accessible而不是電子郵件。

+0

這樣做。我刪除:從該列表中的電子郵件,它的工作。我對Ruby on Rails有點新,所以讓我確保我有這個正確的。從我讀過的,attr_accessor爲指定的字段創建get和set方法。 attr_accessible只允許控制器通過模型訪問該字段? –

+0

attr_accessor是Ruby用於在實例(@)變量的任何類上定義getter和setter方法的簡寫。 ActiveRecord會根據模型上的屬性自動創建這些屬性,因此很少使用它。是的,attr_accessible是一個基本的安全措施,這意味着變量不會被設置爲update_attributes或類似的方法。 –

+0

真棒,感謝您的幫助。來自.Net有很多細節我仍然需要爲Ruby學習。 –