Правильно ли я это сделал? Вызвать действие из контроллера с помощью link_to

Пожалуйста, извините за простоту и длину этого, но у меня есть небольшое тестовое приложение, в котором есть таблица пользователей с атрибутами имени, электронной почты и зарплаты. Я создал почтовик, который будет рассылать отчет об этих данных конкретному пользователю по моему усмотрению, другими словами, когда я нажимаю кнопку. Моя кнопка создается с помощью link_to и вызывает действие в моем основном user_controller, которое затем вызывает действие почтовой программы. (Надеюсь, это только что имело смысл). Это выглядит следующим образом и работает так, как я надеялся; Я просто хочу узнать, правильный ли это способ сделать что-то вроде этого:

В моем user_controller (созданный генератором скаффолдов):

def sendemail  
@user = User.find(params[:id])  
UserMailer.welcome_email(@user).deliver  
redirect_to user_path(@user)  
flash[:notice] = 'Email has been sent!'  
end  

В файле user_mailer.rb:

def welcome_email(user)
@user = user
@url  = "http://example.com/login"
mail(:to => user.email,
     :subject => "Welcome to My Awesome Site")
end

На странице пользователя show.html.erb электронное письмо отправляется следующим образом:

<%= link_to "Send Email", sendemail_user_path(@user) %>

В моем файле route.rb, чтобы все выполнялось правильно (что и происходит):

resources :users do 
member do 
get 'sendemail'
end

Итак, сказав все это, он работает так, как должен. Я нажимаю на страницу пользователя show.html.erb, где у меня будут данные и диаграммы, которые я хочу в конечном итоге отобразить, и по своему усмотрению я могу отправить этому пользователю электронное письмо с этими данными или тем, что я поместил в файл mailer.html.erb. Когда он отправляется, он мигает сообщением, которое я указал в контроллере, и оставляет меня на этой странице, как я и указал; так что это работает. Я просто хочу знать, это правильный и самый рубиновый/рельсовый способ делать что-то?


person FattRyan    schedule 06.04.2011    source источник


Ответы (1)


Этот код очень похож на пример Rails Guides Action Mailer, так что достаточно сказать, что вы создаете железнодорожный код.

Кроме того, если ваше приложение развилось до гораздо большего масштаба, вам следует рассмотреть возможность доставки электронной почты через фоновое задание, чтобы доставка электронной почты не блокировала текущий поток.

В остальном код выглядит великолепно. Конечно, вы, скорее всего, отправите электронное письмо после того, как сделаете что-то успешное в контроллере, а не будете иметь специальное действие для прямой отправки электронной почты. Например, у вас может быть действие welcome, которое отправляет электронное письмо при успешном сохранении записи пользователя.

person McStretch    schedule 06.04.2011
comment
Спасибо за ответ и обратную связь. Можете ли вы объяснить, что вы имеете в виду под этим: рассмотрите возможность доставки электронной почты через фоновое задание, чтобы доставка электронной почты не блокировала текущий поток - person FattRyan; 06.04.2011
comment
@FattRyan - Конечно. Таким образом, в этом простом случае это на самом деле не нужно, но если вы пытаетесь отправить электронное письмо для нескольких пользователей в массиве из контроллера, метод контроллера будет блокироваться до тех пор, пока все эти электронные письма не будут отправлены. Вместо того, чтобы ваш пользователь ждал, пока Action Mailer закончит отправку этих писем, вы хотели бы отправить эти электронные письма в фоновом режиме и заставить контроллер вернуть представление пользователю как можно скорее. Я хочу сказать об отзывчивости приложения для пользователя. Кроме того, если электронная почта не работает, вы бы хотели, чтобы контроллер вышел из строя (таким образом, возврат представления завершился неудачно) - person McStretch; 06.04.2011
comment
Или вы хотите обрабатывать ошибки в фоновом режиме и, если они появляются, повторно отправлять электронное письмо в фоновом режиме? Обычно лучше, если это возможно, не допускать длинных операций к основному пути кода. В случае с электронными письмами, как правило, нормально отправлять их за кулисами и сразу же возвращать пользователю любые данные просмотра. Это проясняет ситуацию? - person McStretch; 06.04.2011
comment
да, это немного помогает, спасибо за разъяснение, имеет смысл. - person FattRyan; 07.04.2011
comment
@FattRyan - нет проблем, я рад, что смог помочь! - person McStretch; 07.04.2011