2017-06-02 152 views
0

我想用Rails 5和Mongoid做一個簡單的用戶註冊功能。我的用戶模型和控制器是這樣的:Rails 5 + Mongoid虛擬屬性

user.rb

class User 
    include Mongoid::Document 
    include Mongoid::Timestamps 

    validates_presence_of :email 
    validates_uniqueness_of :email, case_sensitive: false 

    validates :password, presence: true, confirmation: true 
    validates_presence_of :password_confirmation 

    field :email, type: String 
    field :password, type: String 
    ... 
end 

users_controller.rb

... 
def create 
    @user = User.new(user_params) 
    if @user.save 
    json_response(nil, nil, :created) 
    else 
    json_response(@user.errors.full_messages, nil, :bad_request) 
    end 
end 
... 
private 
    def user_params 
    params.require(:user).permit(:email, :password, :password_confirmation, :avatar) 
    end 

現在我需要檢查,如果password_confirmation相同的密碼,無論是PARAMS通過請求發送,但password_confirmation不傳遞給新的用戶對象,altought在強參數中列入白名單:

log:

Started POST "/users" for 127.0.0.1 at 2017-06-02 13:03:10 +0200 
Processing by UsersController#create as JSON 
Parameters: {"password"=>"[FILTERED]", email"=>"[email protected]", "password_confirmation"=>"[FILTERED]", "user"=>{"email"=>"[email protected]", "password"=>"[FILTERED]"}} 

我不想

field :password_confirmation 

添加到我的模型,解決了這個問題。我只需要使屬性成爲虛擬並在驗證後襬脫它。我錯過了什麼或做錯了什麼?或者對此有何正確態度?

回答

0

在你的模型,其添加爲attr_acessor

Class User 
... 
field :email, type: String 
field :password, type: String 
attr_accessor :password_confirmation 
... 
end 

您可以訪問它,但它不會持久。

+0

不幸的是,這似乎沒有幫助,似乎''params.require(:user).permit(...)'只能與'field'定義的那些屬性一起工作,並忽略'attr_accessor' –

+0

好吧,作爲最後一招你可以添加它作爲一個字段,但通過創建一個before_save過濾器來避免它被保存爲零。這很醜,但會起作用。 –

+0

當然,還有更多「骯髒」的解決方案,但我想做的很好,乾淨... –