RoR: неопределенный метод `new_user_invite 'для InviteMailer: Class - PullRequest
0 голосов
/ 04 марта 2019

Я использовал следующий учебник по созданию приглашения с областью действия (https://coderwall.com/p/rqjjca/creating-a-scoped-invitation-system-for-rails), чтобы создать приглашение, пользователя, группу, но столкнулся с вышеуказанной ошибкой и не уверен, как ее решить. Пожалуйста, имейте в виду, что я все еще изучаю RoR.Спасибо.

У меня есть следующий код в invites_controller.rb

class InvitesController < ApplicationController

  def new
    @invite = Invite.new
  end

  def create
    @invite = Invite.new(invite_params) # Make a new Invite
    @invite.sender_id = current_user.id # set the sender to the current user
    if @invite.save
       InviteMailer.new_user_invite(@invite, new_user_registration_path(:invite_token => @invite.token)).deliver #send the invite data to our mailer to deliver the email
       flash[:notice] = "Thanks, invitation has successfully been sent"
       redirect_to user_groups_url
    else
       flash[:notice] =  "oh no, creating an new invitation failed"
       redirect_to invites_path
    end
  end

  private

    def invite_params
      params.require(:invite).permit(:email, :recipient_id, :user_group_id, :sender_id)
    end

end

Модель для приглашения на отправку токена

class Invite < ApplicationRecord

  before_create :generate_token

  def generate_token
   self.token = Digest::SHA1.hexdigest([self.user_group_id, Time.now, rand].join)
  end


end

Не уверен, что Маршрут завершен?

Rails.application.routes.draw do
  resources :memberships
  resources :user_groups
  # mount RailsAdmin::Engine => '/admin', as: 'rails_admin'
  # devise_for :users
  # delete '/logout', to: 'sessions#destroy'
  default_url_options :host => "smtp.gmail.com"

  devise_for :users, controllers: {
      sessions: 'users/sessions',
      passwords: 'users/passwords',
      registrations: 'users/registrations'
  }
  get 'static_pages/index'

  resources :invites

  namespace :admin, path: '/admin' do
    resources :users, except: [:show] do
      member do
        post :resend_invite
        post :enable
      end
    end
    resources :roles, only: [:index, :edit, :update, :new, :create]
    get "audits/index"
  end
end

просмотр формы для приглашения нового пользователя и существующих пользователей.

= simple_form_for @invite , :url => invites_path do |f|
  = f.error_notification
  = f.error_notification message: f.object.errors[:base].to_sentence if f.object.errors[:base].present?

  space-left3.space-below3
    = f.hidden_field :user_group_id, :value => @invite.user_group_id
    = f.input :email, placeholder: 'user@domain.com'
  .form-actions
    button.btn.btn-primary type="submit" Send

mailer / Invite_mailer.rb

class InviteMailer < ApplicationMailer
  def self.new_user_invite(invite, signup_url)
    subject    'Invite'
    recipients invite.recipient_email
    from       'example@gmail.com'
    body       :invite => invite, :signup_url => signup_url
    invite.update_attribute(:sent_at, Time.now)
  end

  def invite
    @greeting = "Hi"

    mail to: "to@example.org"
  end
end

mailer / application_mailer

 class ApplicationMailer < ActionMailer::Base
      default from: 'from@example.com'
      layout 'mailer'
    end

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Не уверен, смогу ли я это объяснить, но для почтовых программ мы просто определяем методы без синтаксиса класса.Очень удобно думать о почтовике как о контроллере, они очень похожи.Должно быть:

class InviteMailer < ApplicationMailer
  def new_user_invite(invite, signup_url)
    @signup_url = signup_url
    invite.update_attribute(:sent_at, Time.now)
    mail(to: invite.email, subject: 'Invite')
  end
end

Теперь вам нужно просмотреть электронную почту.Создайте файл с именем new_user_invite.html.erb в приложении / views / Invite_mailer /.Для простоты это будет:

<p>Someone invited you to the project, please click link: @signup_url</p>

Также вам нужно изменить new_user_registration_path на new_user_registration_url при вызове почтовой программы, чтобы передать полную ссылку

Подробнее о почтовых программах можно узнать в направляющие

0 голосов
/ 05 марта 2019

Чтобы создать new_user_invite как метод класса в InviteMailer, вы делаете:

class InviteMailer < ApplicationMailer

  class << self 

    def new_user_invite(invite, path)
      ... do stuff
    end

  end

  def invite
    @greeting = "Hi"
    mail to: "to@example.org"
  end

end

Или

class InviteMailer < ApplicationMailer

  def self.new_user_invite(invite, path)
    ... do stuff
  end

  def invite
    @greeting = "Hi"
    mail to: "to@example.org"
  end

end

То, что вы используете, является вопросом личных предпочтений,

Хочу отметить, что Jörg W Mittag хочет сказать:

Я один из тех Руби-Пуристов, которым нравится указывать, что таких нетвещь как метод класса в Ruby.Тем не менее, я совершенно в порядке, используя термин метод класса в разговорной речи, , пока все стороны полностью понимают, что это разговорный термин .Другими словами, если вы знаете , что не существует такой вещи, как метод класса, и что термин «метод класса» просто сокращен от «метод экземпляра синглтон-класса объекта, который является экземпляромClass ", тогда проблем нет.Но в остальном я только видел, как это мешает пониманию.

Пусть все стороны полностью поймут, что термин метод класса используется выше в своем разговорном смысле.

...