Rails 3 проблема с ограничением маршрутов - PullRequest
2 голосов
/ 11 июня 2011

Я пытаюсь сделать так, чтобы у меня могли быть такие URL:

/events
/events/sunday # => The day is optional

Однако, похоже, он не работает, хотя я знаю, что его вызывают.Он находится внизу моего файла маршрутов.

match '/:post(/:day_filter)' => 'posts#index', :as => post_day_filter, :constraints => DayFilter.new 


class DayFilter

    def initialize
        @days = %w[all today tomorrow sunday monday tuesday wednesday thursday friday saturday]
    end

    def matches?(request)
        return @days.include?(request.params[:day_filter]) if request.params[:day_filter]
        true
    end

end

Вот мой вывод о рейк-маршрутах:

post_day_filter        /:post(/:day_filter)(.:format)          {:controller=>"posts", :action=>"index"}

1 Ответ

5 голосов
/ 11 июня 2011

Я не уверен, в чем конкретно проблема, но следующий способ гораздо более эффективен для выполнения той же вещи:

class ValidDayOfWeek
  VALID_DAYS = %w[all today tomorrow sunday monday tuesday wednesday thursday friday saturday]
  def self.matches?(request)
    VALID_DAYS.include? request.params[:day_of_week]
  end
end

get ':/post_type(/:day_of_week)' => 'posts#index', :constraints => ValidDayOfWeek

Самое большое отличие состоит в том, что это позволяет избежать инициализации нового объекта ValidDayOfWeek при каждом запросе. В руководстве по Rails приведен пример, в котором может каждый раз хотеть новый объект (обновление черного списка в реальном времени), но это вводит в заблуждение для случаев, подобных вашему.

Кроме того, вы получили немного многословно в своем методе matches? - нет необходимости в явном возврате или условном выражении, так как includes? вернет либо true, либо false как есть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...