Как сгенерировать массив действий контроллера в Ruby on Rails?

#ruby-on-rails #ruby

#ruby-on-rails #ruby

Вопрос:

В моем приложении Rails 4 у меня есть несколько статических pages данных, которые должны либо индексироваться Google, либо нет. Я использую переменную indexable для этого, но, вероятно, есть лучший способ:

 class PagesController < ApplicationController

  def home
    indexable = true
  end

  def about_us
    indexable = true
  end

  def secret_stuff
    indexable = false
  end

end
 

Как я могу сгенерировать массив всех страниц, которые есть indexable ?

Я пытался сделать это в помощнике, но это не работает:

 def indexable_pages
  array = []
  PagesController.instance_methods(false).each do |action|
    if action.indexable == true # this won't work of course
      array << action
    end
  end
  array
end
 

Спасибо за любую помощь.

Комментарии:

1. Вероятно, это неправильный способ сделать это. Многие из этих действий недоступны GET . Как насчет чего-то похожего на то, что rake routes делает? Индексируемо не само действие, а путь, который заканчивается этим действием, которых может быть много.

2. @tadman: Хорошо, согласен. Но как я могу получить эти пути в массив?

3. У @anthony есть начало решения здесь. Возможно, вам захочется расширить систему маршрутизации, чтобы разрешить поддержку флагов, подобных indexable: true поддерживаемым.

4. @tadman: Хорошо, звучит хорошо, но я ничего не могу найти на Rails routes и «flags». Можете ли вы указать мне на пример?

5. Вам пришлось бы серьезно покопаться в системе маршрутизации Rails, исправив ее, чтобы включить параметры, которых у нее обычно нет. Это, вероятно, сильно усложняет то, что должно быть простой проблемой. Простой способ — использовать определенный стиль комментариев в вашем routes.rb файле, который вы можете найти и обработать с помощью утилиты script, преобразуя их в вашу карту.

Ответ №1:

Может быть, before_filter будет иметь смысл?

 class PagesController < ApplicationController
  before_filter :set_indexable, except: [:secret_stuff]

  def home
  end

  def about_us
  end

  def secret_stuff
  end

  private 

  def set_indexable
    @indexable = true
  end

end
 

Комментарии:

1. Однако вам придется запускать каждое действие, чтобы определить, является ли оно индексируемым. Это сомнительная полезность.