Как использовать промежуточное программное обеспечение для стойки с Rails3? - PullRequest
2 голосов
/ 19 ноября 2010

Эй, ребята, я пытаюсь настроить промежуточное ПО для стойки NotFound для работы с rails3, но мне нужно было внести некоторые изменения, чтобы вернуть json, поэтому я определил новый класс:

class NotFound

  def initialize(app, msg, content_type = "text/html")
    @app = app
    @content = msg
    @length = msg.size.to_s
    @content_type = content_type
  end

  def call(env)
    [404, {'Content-Type' => @content_type, 'Content-Length' => @length}, @content]
  end
end

Я добавил этот класс выше в "app / middleware / not_found.rb" и добавил следующую строку в мой файл application.rb:

config.middleware.use "NotFound", {:error => "Endpoint Not Found"}.to_json, "application/json"

и теперь ... ну, он работаеткак я и ожидал ... он всегда возвращает

{"error"=>"Endpoint Not Found"}

Теперь, как я могу заставить его работать только в случае сбоя маршрутизатора?Я видел, что есть метод insert_after, но не могу его реализовать после Application.routes

ps: я знаю, что смогу справиться с этим с помощью маршрутизатора rails3, но это эксперимент, я просто развлекаюсь:-)

Спасибо!

1 Ответ

2 голосов
/ 20 ноября 2010

Маршрутизатор Rails уже вернет ответ 404, если не найдено ни одного маршрута. Если вы хотите настроить этот ответ, я полагаю, вы могли бы сделать:

class NotFound
  def initialize(app, msg, content_type = "text/html")
    @app = app
    @content = msg
    @length = msg.size.to_s
    @content_type = content_type
  end

  def call(env)
    status, headers, body = @app.call(env)

    if status == 404
      [404, {'Content-Type' => @content_type, 'Content-Length' => @length}, @content]
    else
      [status, headers, body]
    end
  end
end
...