使用Mailgun gem创建ActionView :: MissingTemplate - Rails 4

时间:2014-10-29 15:34:37

标签: ruby-on-rails heroku mailgun

我正在使用Rails 4进行社交书签项目。我使用Mailgun gem允许用户通过电子邮件将书签发送到应用程序,以保存为书签记录。我的方法在本地控制台中工作,但在通过向Heroku发送电子邮件进行测试时,我会收到:

2014-10-29T15:11:10.881903+00:00 app[web.1]: Completed 500 Internal Server Error in 1086ms
2014-10-29T15:11:10.881913+00:00 app[web.1]: Completed 500 Internal Server Error in 1086ms
2014-10-29T15:11:10.884245+00:00 app[web.1]: 
2014-10-29T15:11:10.884248+00:00 app[web.1]: ActionView::MissingTemplate (Missing template bookmarks/create_by_mail, application/create_by_mail with {:locale=>[:en], :formats=>[:html], :handlers=>[:erb, :builder, :raw, :ruby, :jbuilder, :coffee]}. Searched in:
2014-10-29T15:11:10.884249+00:00 app[web.1]:   * "/app/app/views"
2014-10-29T15:11:10.884251+00:00 app[web.1]:   * "/app/vendor/bundle/ruby/2.0.0/gems/devise-3.4.0/app/views"
2014-10-29T15:11:10.884252+00:00 app[web.1]: ):

为什么要寻找视图?这个动作应该在幕后完全处理。

相关代码:

skip_before_filter :verify_authenticity_token, only: [:create_by_mail]


  def create_by_mail
    @sender = params["sender"]
    @subject = params["subject"]
    @body = params["body-plain"]

    @bookmark = Bookmark.new(title: get_title_from_link(@subject), link: @subject, description: @body, category_ids: category_matcher(@body))
    @bookmark.save!
  end

私人方法:

private

  require 'net/http'
  require 'nokogiri'
  require 'open-uri'

  def get_base(url)
    uri = URI(url)
    response = Net::HTTP.get_response(uri)
    base = response["location"]
    if base
      base
    else
      url
    end
  end

  def get_title_from_link(url)
    base_url = get_base(url)
    doc = Nokogiri::HTML(open(base_url).read)
    doc.at_css("title").text
  end

  def parse_categories(text)
    r = /#.[^\s]+/
    text.scan(r)
  end

  def category_matcher(text)
    category_array = []
    parse_categories(text).each do |cat|
      category_array << Category.find_or_create_by(name: cat).id
    end
    category_array
  end

  def categories_to_array(categories)
    category_array = []
    categories.each do |key, value|
      if value == '"id"=>"1"'
        category_array << key
      end
    end
    category_array
  end

1 个答案:

答案 0 :(得分:2)

create_by_mail看起来像是BookmarksController中的一个动作方法。默认情况下,控制器操作方法将尝试使用与操作方法相同的模板名称呈现HTML视图。 BookmarksController#create_by_mail操作方法尝试呈现app/views/bookmarks/create_by_mail.html.erb

要覆盖此默认呈现行为,操作方法需要包含对renderredirect的调用以及所需行为所需的参数。