缺少Ruby on Rails项目上的模板博客/索引

时间:2011-04-05 18:57:56

标签: ruby-on-rails

对于我的一个项目,我偶尔得到这个例外:

  

ActionView :: MissingTemplate:缺少模板博客/索引{:handlers => [:rxml,:erb,:builder,:rjs,:haml,:rhtml],:formats => [“image / jpeg “,”image / pjpeg“,”image / png“,”image / gif“],:locale => [:en,:en]}在视图路径中”/ var / www / keeponposting / releases / 20110403083651 / app /意见“

似乎有人要求的图片来自不是图片的网址:

  

HTTP_ACCEPT“image / jpeg,image / pjpeg,image / png,image / gif”

有什么想法可以做些什么吗?我是否必须为其中一个实现处理程序并返回“”以消除此异常,或者是否有更好的方法来处理它?<​​/ p>

现在我也得到了这个:

  

ActionView :: MissingTemplate:缺少模板博客/索引{:formats =&gt; [“text / *”],:handlers =&gt; [:rjs,:haml,:rhtml,:erb,:rxml,:构建器],:locale =&gt; [:en,:en]}在视图路径“/ var / www / keeponposting / releases / 20110415040109 / app / views”

无论请求的格式是什么,都没有办法发回HTML?

6 个答案:

答案 0 :(得分:13)

我同意阻止有问题的机器人,但是如果你真的想强制使用响应格式,请添加before_filter并设置request.format = :html,如下所示:

before_filter :force_request_format_to_html

private

def force_request_format_to_html
  request.format = :html
end

答案 1 :(得分:8)

我使用这个新的Rails 3.1选项解决了这个问题(几分钟前 - 到目前为止,这么好):

config.action_dispatch.ignore_accept_header = true

this Rails issue中所述。这是config/application.rb

我在RSpec请求测试(使用Capybara)中测试了它:

it "should not break with HTTP_ACCEPT image/*;w=320;h=420 from iPhone" do
  page.driver.header "Accept", "image/*;w=320;h=420"
  visit "/some/path"
  page.should have_content("Some content")
end

答案 2 :(得分:6)

这是一个更严格的回应; purp的建议,来自issue 4127的讨论。

class FooController
  rescue_from  ActionView::MissingTemplate, :with => :missing_template

  def missing_template
    render :nothing => true, :status => 406
  end
end

答案 3 :(得分:5)

我很想在应用程序控制器中解救MissingTemplate并记录Referrer标头以查看触发此请求的内容。你永远不知道,它可能是你自己的应用程序的一些不起眼的部分!

另一方面,如果您确信这是由机器人引起的,您是否考虑过将违规网址添加到robots.txt文件中?例如:

User-Agent: YandexImages
Disallow: /your/failed/path

用机器人绊倒的路径替换“你的/失败/路径”。如果机器人在整个地方挣扎,你可能只是不允许访问该特定机器人的整个站点:

User-Agent: YandexImages
Disallow: /

我认为这比实现专门用于抑制看似行为不当的机器人的错误的处理程序更清晰,更轻松。

答案 4 :(得分:0)

我这样做了: 在我的控制器中,我放了一个前过滤器:

def acceptable_mime_type
  unless request.accepts.detect{|a| a == :json || a == :html} || request.accepts.include?(nil)
    if request.accepts.detect{|a| a.to_s().include?("*/*")}
      ActionDispatch::Request.ignore_accept_header = true
    else
      render text: "Unacceptable", status: 406
      false
    end
  end
end

它检查我支持的类型(例如json,html)和nil(nil呈现默认html),然后如果不支持这些mime类型,它会检查标题中的“ / ” 。如果找到它,我强制rails通过忽略accept标头来呈现默认的mime类型。

要在rspec中测试这个,我必须这样做:

describe 'bad header' do
  describe 'accept' do
    let(:mimeTypes) { ["application/text, application/octet-stream"] }

    it 'should return a 406 status code' do
      request.accept = mimeTypes
      get 'index'
      expect(response.response_code).to eq 406
    end

    describe 'with */* included' do
      it 'should return a 200 status code' do
        request.accept = ["*/*"] + mimeTypes
        get 'index'
        expect(response.response_code).to eq 200
      end
    end
  end
end

出于某种原因,我在尝试使用here描述的方法在rspec中正确发送接受标头时遇到问题,但我发现如果我将request.accept设置为一个数组,我的测试都通过了。很奇怪,我知道,但我现在正在继续讨论下一期。

答案 5 :(得分:0)

formats: [:html]添加到渲染:

def action
  render formats: [:html]
end