случай условий не работает правильно

Я использую для тегов «действия как теги».

апартаменты_контроллер

def index
  if params[:tag]
    @apartments = Apartment.tagged_with(params[:tag])
  else
    @apartments = Apartment.all
  end    
end

маршруты

resources :apartments do
  #...
  collection do
    get ':tag', to: 'apartments#index', as: :tag
  end
  #...

Я получаю хорошие URL-адреса, например /apartments/tag1 и т. д.

Я хочу отображать пользовательский контент на основе имени тега в шаблоне апартаментов index.

Apartment мнение index:

- @appartments.each do |tags|
   - case tags.tag_list
   - when "tag1"
      %p tag1 content
   - when "tag2"
      %p tag2 content
   - else
      %p default content

Когда я перехожу по URL-адресу apartments/tag1, отображается текст "default content", а не "tag1 content".

Что я делаю неправильно?


person Remco    schedule 16.11.2012    source источник
comment
каков результат tags.tag_list? Вы можете сделать %p= tags.tag_list перед оператором case, чтобы увидеть вывод   -  person MrYoshiji    schedule 16.11.2012
comment
когда я захожу в квартиру с тегом 1 в консоли. a = Apartment.find(28) a.tag_list я получаю tag1 в качестве вывода   -  person Remco    schedule 16.11.2012
comment
Попробуйте to_s в tag_list: - case tags.tag_list.to_s.   -  person MrYoshiji    schedule 16.11.2012


Ответы (1)


Там несколько заметок о вашем коде:

  1. Держите свою логику подальше от взглядов. т.е. извлекать код во вспомогательные методы.
  2. Не используйте case на Enumerable, в вашем случае это похоже на массив. Используйте include?, чтобы проверить, присутствует ли элемент внутри массива:

1.9.3p194 :001 > a= [:a, :b, :c]
 => [:a, :b, :c] 
1.9.3p194 :002 > case a
1.9.3p194 :003?>   when :a
1.9.3p194 :004?>   p '1'
1.9.3p194 :005?>   when :b
1.9.3p194 :006?>   p '2'
1.9.3p194 :007?>   when :c
1.9.3p194 :008?>   p '3'
1.9.3p194 :009?>   when :d
1.9.3p194 :010?>   p 'Never'
1.9.3p194 :011?>   end
 => nil 
1.9.3p194 :012 > a.include?(:c)
 => true 
person Mark Huk    schedule 16.11.2012
comment
Я попробовал ваше предложение, например, на примере... rails c › a = Apartment.find(26) › a.tag_list › output =› [lux, familie, groups], а затем a.include?(lux) я понял ошибка NoMethodError: неопределенный метод `включить?' (рубин 1.9.2p290/активмодель-3.2.8) - person Remco; 16.11.2012
comment
a.tag_list.include?('lux') Кажется, там опечатка? - person Mark Huk; 19.11.2012