1

我已創建並(希望設置)郵件。電子郵件在軌道撰寫視圖

而不是發送模板,我想通過電子郵件發送表單textarea的內容在視圖中。

我需要一個視圖來編輯消息,該消息應發送給控制器,控制器又會調用我的郵件程序中的send_mail方法。

Class Notifier < ActionMailer::Base 
    default from: "[email protected]" 

    def send_email(email, subject, body) 
    mail(
    :to => email, 
    :subject => subject 
) do |format| 
    format.text { render :text => body } 
    end 
end 

end 

這是我的看法:

<%= form_for(:post, :url => {:action => 'send'}) do |f| %> 
    <%= f.text_field(:title, class: 'form-control')%> 
    <%= f.text_area(:content, rows: 15)%> 
    <%= f.button "Submit", type: 'submit' %> 
<% end %> 

的問題是,產生與軌道郵包當G郵件通知

我得到了一個郵寄和notifier.rb在意見通知文件夾。但是,我沒有通告器視圖的視圖控制器。

問:如何在我的視圖和發送輸入文本之間建立鏈接?

回答

2

您需要創建一個控制器來處理您的視圖,並且在該控制器中,您需要像這樣調用郵件程序:(您需要更改表單字段的名稱以匹配調用中的參數或反之亦然)

Notifier::send_email(params[:email], params[:subject], params[:body]).deliver 

我建議你看看這RailsCasts:

+0

這看起來沒錯..已經開始實施它了謝謝 – 2014-11-22 21:37:12

0

所以想想你的notifier.rb作爲控制器。您在其中定義了#send_mail。這意味着在views/notifier中你應該添加一個send_mail.html.haml(erb/slim ...味道的問題),它將成爲郵件的主體。

現在從接收表單中的控制器,你只需要調用

Notifier.send_mail(email, subject, body).deliver 
2

這可能是一個好地方,使非ActiveRecord的模式。我明白現在問題已經解決了,這有點超出範圍,但它很有用,爲什麼不呢?

我建議你看看pattern 3 in this article並建立封裝形式存儲的內容,確認他們和發送實際的電子郵件的過程中的表單模型Notification?)。請注意,文章中的實現已經過時了,Rails 4引入了ActiveModel::Model來促進這個過程。

優點:

  • 在聲明樣式大多定義另一個類,方便閱讀和查找
  • 可以通過SimpleForm或Rails的形式傭工來容易且乾淨奠定了
  • 獲取所有傳統Rails模型的好處,如驗證(如果失敗,則會出錯)
  • 語義,代碼看起來與使用數據庫或其他應用程序的其他應用程序一致

缺點:

  • 另一類,可視爲過度設計
  • 更多的代碼,更多的工作,易於維護是值得商榷
  • 另一目的在於使這種形式的控制器創建

一旦完成,使其工作的過程與使其他資源工作的過程幾乎相同。我假設,這個郵件程序位於單獨的頁面上。

路線:

resource :notification, only: [:create] do 
    get :new, path: "" # A matter of taste, really 
    # You may use the default `new` route 
    # with a path `notifications/new` 
end 

控制器:

class NotificationsController 
    def new 
    @notification = Notification.new 
    end 

    def create 
    @notification = Notification.new(notification_params) 
    if @notification.send 
     # success! redirect somewhere? 
    else 
     render :new # render the form again with the errors 
    end 
    end 

    private 
    def notification_params 
    params.require(:notification).permit(:email, :subject, :body) 
    end 
end 

您還需要爲new的行動,呈現@notification爲形式的視圖。只有new,創建並不需要它自己的。而現在最有趣的部分,型號:

class Notification # Yep, it inherits nothing! 
    include ActiveModel::Model 

    attr_reader :email, :subject, :body 

    validates :email, 
    presence: true # You might want to validate its format? 
    validates :subject, 
    presence: true, length: {in: 0..100} # Too long subjects are annoying 
    validates :body, 
    presence: true 

    def persisted? 
    false # I have no idea why, but it's defined in the article, no harm done 
    # I'd love to hear the explaination about this though 
    end 

    def send 
    if valid? # no objections from validations? 
     # Alright, send it already! 
     Notifier.send_mail(email, subject, body).deliver 
     # thanks for this line go to @Daniel and his answer 
     true 
    else 
     false 
    end 
    end 
end 

最後,PRO提示:Rails的4.2(前沿馬上!)推出ActiveJob,一個與郵件程序集成。通過調用deliver方法,並調用deliver_later,您將按照here (edge guides, subject to change quite soon)所述的順序將後臺任務處理器發送的電子郵件排入隊列。我並不認爲現在是時候在任何地方使用它(太新了),但考慮到未來的項目。

我真的認爲這很好嗎?是的,我真的這樣做,我已經重構了一個用戶密碼更改器,以這種方式來看,代碼變得更容易導航和查看。

相關問題