Ссылки тегов, не работающие с тегами, работают и в Rails 3.1 - PullRequest
1 голос
/ 05 ноября 2011

В настоящее время я использую следующие драгоценные камни в своем приложении для обеспечения нумерации страниц, поиска, связываемых тегов и облака тегов.

gem 'will_paginate', '~> 3.0.2' gem 'actions-as-taggable-on', '~> 2.1.0'

У меня все реализовано до сих пор в Rails 3.1, кроме ссылок тегов. Они отображаются ниже каждого поста и в облаке тегов, и оба они ссылаются на разные виды, и ни один из них не работает.

Ссылка в облаке тегов (Test1) связывает меня с: / posts / tag? Id = Test1, что выдает ошибку «Не удалось найти сообщение с id = тегом»

А ссылка в посте перенаправляет меня на / posts? Tag = Test2 & view = tag, которая ничего не меняет. Все мои сообщения все еще отображаются.

Вот что я изменил до сих пор, чтобы попытаться реализовать это:

Отредактированная часть моих маршрутов. Rb:

resources :posts do
collection do
  get :tag
end

конец

Мой пост.рб:

acts_as_taggable_on :tags
def self.tag_post_list(page, tag)

  Post.tagged_with(tag).by_date.paginate(:page => params[page], :per_page => 20)

end

Post_Controller.rb:

def index
  @posts = Post.search(params[:search], params[:page])
  @tags = Post.tag_counts_on(:tags)
  if request.xhr?
    render :partial => @posts
  end
end
def tag
  @posts = Post.tagged_with(params[:id])
  @tags = Post.tag_counts_on(:tags)
  render :action => 'index'
end
def show
  @post = Post.find(params[:id])
  @tags = Post.tag_counts_on(:tags)

  respond_to do |format|
    format.html # show.html.erb
    format.json { render json: @post }
  end
end

Posts_helper.rb:

include ActsAsTaggableOn::TagsHelper

Облако тегов в application.html.erb

<% tag_cloud(@tags, %w(css1 css2 css3 css4)) do |tag, css_class| %>
<%= link_to tag.name, { :action => :tag, :id => tag.name }, :class => css_class %>
<% end %>

Определение облака тегов в application_controller.rb

def tag_cloud
  @tags = Post.tag_counts_on(:tags)
end

Ссылки в моих постах:

<% for tag in post.tags %>
<%= link_to tag.name, posts_path(:view =>'tag', :tag => tag.name) %>
<% end %>

Ошибка в моей консоли:

Started GET "/posts/tag?id=Test1" for 127.0.0.1 at 2011-11-05 00:35:00 -0700
Processing by PostsController#show as HTML
Parameters: {"id"=>"tag"}
Post Load (0.0ms)  SELECT "posts".* FROM "posts" WHERE "posts"."id" = $1 LIMIT 1  [["id", "tag"]]
Completed 404 Not Found in 3ms

ActiveRecord::RecordNotFound (Couldn't find Post with id=tag): app/controllers/posts_controller.rb:33:in `show'

Последние 5 часов я искал в интернете, пытаясь выяснить это, но ничего не актуально или совершенно не актуально.

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

Ответы [ 2 ]

1 голос
/ 07 ноября 2011

Глупая ошибка:

Я не передавал paginate в массив @posts в определении тега

@posts = Post.tagged_with(params[:id]).paginate(:page => params[:page], :per_page => 10)

Работа отлично. Спасибо за помощь, вы были частью решения.

0 голосов
/ 05 ноября 2011

Если посмотреть на вывод rake routes, вот ваша проблема:

     post GET    /posts/:id(.:format)         {:action=>"show", :controller=>"posts"}
    ...
tag_posts GET    /posts/tag(.:format)         {:action=>"tag", :controller=>"posts"}

URL /posts/tag?id=Test1 соответствует обоим этим маршрутам, поэтому используется первый, приводящий к действию posts#showвызывается вместо действия posts#tag, как предполагалось.

Теперь я не совсем уверен, почему это так - у вас слишком много маршрутов, определенных для контроллера сообщений.У вас есть какие-нибудь записи для posts где-нибудь в вашем файле маршрутов, помимо той, что у вас есть в вашем вопросе?

Только с этим:

resources :posts do
  collection do
    get :tag
  end
end

ваш rake route вывод должен выглядеть следующим образом:

tag_posts GET    /posts/tag(.:format)       {:action=>"tag", :controller=>"posts"}
    posts GET    /posts(.:format)           {:action=>"index", :controller=>"posts"}
          POST   /posts(.:format)           {:action=>"create", :controller=>"posts"}
 new_post GET    /posts/new(.:format)       {:action=>"new", :controller=>"posts"}
edit_post GET    /posts/:id/edit(.:format)  {:action=>"edit", :controller=>"posts"}
     post GET    /posts/:id(.:format)       {:action=>"show", :controller=>"posts"}
          PUT    /posts/:id(.:format)       {:action=>"update", :controller=>"posts"}
          DELETE /posts/:id(.:format)       {:action=>"destroy", :controller=>"posts"}

Здесь маршрут tag_post определен до значения по умолчаниюpost маршрут, который решит вашу проблему.

РЕДАКТИРОВАТЬ :

Исходя из вашего комментария, немного измените добавленный вами маршрут к этому:

match "/posts/tag/:id" => "posts#tag", :as => :tag_posts

и затем используйте указанный маршрут в вашей ссылке:

link_to tag.name, tag_posts_path(tag.name)
...