2016-03-02 1 views
1

Beginner rails error Я пытаюсь отправить электронные письма всем текущим пользователям при обновлении статьи.Rails ActionMailer error undefined email

У меня есть sendgrid и разработка, настроенная с моим приложением, и я могу заставить почтовый сервер работать через консоль рельсов. Но по какой-то причине я получаю undefined method email for #<User::ActiveRecord_Relation:0x007f8685aebec0> при обновлении статьи.

ArticleNotificationMailer

class ArticleNotificationMailer < ApplicationMailer 
     default from: '[email protected]' 

     def new_article(user, article) 
     @user = user 
     @article = article 

     mail(
      to: @user.email, 
      subject: "New update to article #{article.title}" 
     ) 
     end 
    end 

new_article.html.erb

<!DOCTYPE html> 
    <html> 
     <head> 
     <meta content="text/html; charset=UTF-8" http-equiv="Content-type" /> 
     </head> 
     <body> 
     <h1>New article on website "<%= @article.title %>"</h1> 
     <p> 
      <%= @article.body %> 
     </p> 
     <p> 
      <%= link_to "View Comment on site", article_url(@article, anchor: "updates=#{@article.id}") %> 
     </p> 
     </body> 
    </html> 

ArticleController Я использую ArticleNotificationMailer.new_article(@user, @article).deliver

 def update 
     respond_to do |format| 
      if @article.update(article_params) 
      ArticleNotificationMailer.new_article(@user, @article).deliver 
      format.html { redirect_to @article, notice: 'Article was successfully updated.' } 
      format.json { render :show, status: :ok, location: @article } 
      else 
      format.html { render :edit } 
      format.json { render json: @article.errors, status: :unprocessable_entity } 
      end 
     end 
     end 

Сообщение об ошибке

NoMethodError in ArticlesController#update 
undefined method `email' for #<User::ActiveRecord_Relation:0x007f8685aebec0> 

mail(
    to: @user.email, 
    subject: "New post to articles #{article.title}" 
) 
end 

Rails консоли

>> u = User.last 
>> a = Article.first 
>> ActionNotificationMailer.new_article(u, a).deliver_now 

ответ

0

Я понял, как исправить это.

Я добавил код ниже в article.rb и добавил @ article.send_notifications! к моему контроллеру обновлений.

def send_notifications! 
user = User.all 
user.each do |user| 
    ArticleNotificationMailer.new_article(user, self).deliver_now 
end 
end 
1
ArticleNotificationMailer.new_article(@user, @article).deliver 

Похоже @user был инициализирован User.where() в контроллере. User.where возвращает экземпляр Пользователь :: ActiveRecord_Relation, который на самом деле является массивом с расширенными рельсами. И ошибки возникают, когда вы пытаетесь позвонить по электронной почте на этот массив.

Просто используйте User.find, если вам нужно найти только одну запись.

0

Попробуйте передать идентификатор элементов.

class ArticleNotificationMailer < ApplicationMailer 
     default from: '[email protected]' 

     def new_article(user_id, article_id) 
     @user = User.where(id: user_id) 
     @article = Article.where(id: article_id) 

     mail(
      to: @user.email, 
      subject: "New update to article #{article.title}" 
     ) 
     end 
    end 


In your console 
>> u = User.last 
>> a = Article.first 
>> ActionNotificationMailer.new_article(u.id, a.id).deliver_now