2017-06-02 14 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 

今、私は両方のparamsがあり、password_confirmationはパスワードと同じであるかどうかを確認する必要があります要求を送信しますが、password_confirmationは新しいユーザオブジェクトに渡されません。それは強力なパラメータでホワイトリストに登録されています。

ログ:

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

確かに、もっと「汚い」解決策がありますが、私はそれをきれいにしたいと思います... –

関連する問題