Rails 5 + виртуальный атрибут Mongoid

Я пытаюсь создать простую функцию регистрации пользователя с помощью Rails 5 и Mongoid. Моя пользовательская модель и контроллер выглядят так:

пользователь.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 с паролем, оба параметра отправляются через запрос, но 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

к моей модели, которая решает эту проблему. Мне просто нужно сделать атрибут виртуальным и избавиться от него после проверки. Что я упускаю или делаю неправильно? Или каково правильное отношение к этому?


person David Bambušek    schedule 02.06.2017    source источник


Ответы (1)


В вашей модели добавьте его как attr_acessor

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

Вы сможете получить к нему доступ, но он не будет сохранен.

person Mateus Pinheiro    schedule 17.06.2017
comment
к сожалению, это не помогает, кажется, что params.require(:user).permit(...) может работать только с теми атрибутами, которые определены field, и игнорирует attr_accessor - person David Bambušek; 20.06.2017
comment
Что ж, в крайнем случае вы можете добавить его как поле, но предотвратить его сохранение, создав фильтр before_save, чтобы обнулить его. Это некрасиво, но будет работать. - person Mateus Pinheiro; 21.06.2017