Добавление только devise :confirmable к модели

Мне нужно добавить функцию подтверждения по электронной почте в модель в приложении Rails, но больше ничего. Это не модель пользователя, она не аутентифицируема.

Я добавил devise :confirmable в модель и запустил миграцию:

class AddConfirmableToProjects < ActiveRecord::Migration
  def up
    add_column :projects, :confirmation_token, :string
    add_column :projects, :confirmed_at, :datetime
    add_column :projects, :confirmation_sent_at, :datetime
    add_index :projects, :confirmation_token, :unique => true
  end

  def down
    remove_column :projects, :confirmation_token, :confirmed_at, :confirmation_sent_at
  end
end

Но когда я создаю новый проект, я получаю: Could not find a valid mapping for #<Project...


person Nicolas    schedule 21.04.2013    source источник


Ответы (2)


Звучит немного странно добавлять :confirmable к модели, которая не является вашей пользовательской моделью. Вы в этом уверены?

# Confirmable is responsible to verify if an account is already confirmed to
# sign in, and to send emails with confirmation instructions.

Если да, возникает ли эта ошибка после выполнения спецификаций/тестов? Если вы используете FactoryGirl с RSpec, попробуйте добавить config.cache_classes = true в файл test.rb. Это немного сомнительно, но похоже на единственное решение.

Если нет, предоставьте дополнительный код (модель, контроллер, представление).

person trymv    schedule 21.04.2013
comment
Я хочу сделать это, чтобы проверить адреса электронной почты пользователей: люди могут загружать что-либо в приложение, но после этого им необходимо подтвердить свою электронную почту. Только один раз. Это терпит неудачу при нормальных обстоятельствах, нет rspec. - person Nicolas; 21.04.2013

Да, мы можем установить для любой модели. Ниже приведены шаги для этого. Допустим, у меня есть модель Invitation:

  1. Добавьте devise :confirmable к Invitation
  2. Эта модель должна иметь атрибут :email
  3. Создайте миграцию со следующими столбцами:

    t.string   "email"
    t.string   "confirmation_token"
    t.datetime "confirmed_at"
    t.datetime "confirmation_sent_at"
    
  4. Создайте контроллер, который должен расширить Devise::ConfirmationsController. Добавьте в этот контроллер следующий код:

    def create
      self.resource = resource_class.send_confirmation_instructions(params[resource_name])
      if successful_and_sane?(resource)
        respond_with({}, :location => root_url)
      else
        # code your logic
      end
    end
    
    def new; end
    
    def show; end
    
    • Создайте представление электронной почты confirmation_instruction.html.erb в разделе "app/views/devise/mailer/"

    • Следующая строка создаст URL-адрес подтверждения в вашем письме: <%= confirmation_url(@resource, :confirmation_token => @resource.confirmation_token) %>

    • Теперь создайте новую запись вашей модели "Приглашение" Invitation.create(:email => params[:email]

    • Теперь при успешном создании запись будет сохранена в БД, и электронная почта также будет отправлена ​​​​на эту электронную почту.

person tahniyat    schedule 23.05.2013