Rails link_to с act_as_taggable_on_steroids - PullRequest
       17

Rails link_to с act_as_taggable_on_steroids

2 голосов
/ 18 февраля 2011

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

<%= link_to tag, tag_path(:id => tag.name) %>

при доступе к URL:

http://localhost:3000/tags/rails

Я получаю ошибку:

No action responded to rails. Actions: show

Однако этот URL работает:

http://localhost:3000/tags/show/rails

Я определил действие show в моем tags_controller.rb

class TagsController < ApplicationController
  def show
    @stories = Story.find_tagged_with(params[:id])
  end
end

У меня есть следующие маршруты, сгенерированные rake: маршруты:

           tags GET    /tags(.:format)                             {:controller=>"tags", :action=>"index"}
                POST   /tags(.:format)                             {:controller=>"tags", :action=>"create"}
        new_tag GET    /tags/new(.:format)                         {:controller=>"tags", :action=>"new"}
       edit_tag GET    /tags/:id/edit(.:format)                    {:controller=>"tags", :action=>"edit"}
            tag GET    /tags/:id(.:format)                         {:controller=>"tags", :action=>"show"}
                PUT    /tags/:id(.:format)                         {:controller=>"tags", :action=>"update"}
                DELETE /tags/:id(.:format)                         {:controller=>"tags", :action=>"destroy"}

так что я знаю, что теги URL / rails указывают на теги маршрута /: id, и я предоставил дополнительный параметр link_to, чтобы назначить имя тега как параметр: id, но, как вы можете видеть, это не работает , Форум предложил мне использовать to_param, но у меня нет модели тегов, а книга предложена против этого. Я что-то упустил?

Я слежу за книгой Sitepoint Simply Rails 2

РЕДАКТИРОВАТЬ: добавлен рабочий URL, см. Топ

Ответы [ 4 ]

0 голосов
/ 24 февраля 2011

Для меня это выглядит как разница в rout.rb между

resources :tags

и

resource :tags

Первое будет иметь индексное действие по умолчанию, второе не будет иметь:индекс, но он ответит показом по маршруту по умолчанию.

0 голосов
/ 20 февраля 2011

Съемка в темноте здесь, но должна

<%= link_to tag, tag_path(:id => tag.name) %>

быть

<%= link_to tag, tag_path(:id => tag.id) %>

или

<%= link_to tag, tag_path(tag) %>

0 голосов
/ 20 февраля 2011

Попробуйте это по вашей ссылке:

link_to tag.name, { :action => :tag, :id => tag.name }

Я не знаю, какую версию рельсов вы используете, я предполагаю 3.

По сути, вы используете tag_path, который выходит из идентификатора. Если вы ничего не изменили, это означает что-то вроде tag/43, тег с идентификатором 43. Причина, по которой вам было предложено переопределить to_param, заключается в том, что вы хотите, чтобы вместо этого тега не было имени, поэтому tag/rails. Для этого вы делаете что-то вроде этого:

class Tag
  def to_param
    name
  end
end

Наконец, вам придется изменить действие show, чтобы использовать имя, а не идентификатор. Итак @stories = Story.find_tagged_with(params[:name]). Тогда я считаю, что вы захотите создать маршрут, чтобы компенсировать это, поэтому над вашим resources :tags добавьте match "/tags/:name" => "tags#show".

0 голосов
/ 18 февраля 2011

Попробуйте добавить это в свой ресурс маршрута:

:requirements => { :id => /.*/ }
...