2015-08-24 4 views
0

У меня есть теги, показывающие в моей категории шоу. Когда кто-то просматривает категорию мобильных телефонов, они видят теги вверху, такие как iphone, apple, 16gb, black и ect. Когда кто-то нажимает 16gb, он должен показывать каждый элемент с отметкой 16gb.Act As Taggable Error

Я работал над этой ошибкой в ​​течение 12 часов и не могу ее исправить.

Когда кто-то нажимает на тег, я получаю эту ошибку.

ActiveRecord::RecordNotFound in CategoriesController#show 
Couldn't find Category with 'id'= 

    def set_category 
     @category = Category.find(params[:id]) 
    end 

Не могу понять, как это исправить?

Im using act_as_taggable gem.

Вот категория контроллер

class CategoriesController < ApplicationController 
    before_action :set_category, only: [:show] 
    before_action :admin_user,  only: [:destroy, :index, :edit] 

    def index 
    @categories = Category.all 
    end 

    def show 
    if params[:tag] 
     @items = Item.tagged_with(params[:tag]) 
    else 
     @items = Item.where(category_id: @category.id).order("created_at DESC") 
    end 
    end 

    def new 
    @category = Category.new 
    end 

    def edit 
    end 

    def create 
    @category = Category.new(category_params) 

    respond_to do |format| 
     if @category.save 
     format.html { redirect_to @category, notice: 'Category was successfully created.' } 
     format.json { render :show, status: :created, location: @category } 
     else 
     format.html { render :new } 
     format.json { render json: @category.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    def update 
    respond_to do |format| 
     if @category.update(category_params) 
     format.html { redirect_to @category, notice: 'Category was successfully updated.' } 
     format.json { render :show, status: :ok, location: @category } 
     else 
     format.html { render :edit } 
     format.json { render json: @category.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    def destroy 
    @category.destroy 
    respond_to do |format| 
     format.html { redirect_to categories_url, notice: 'Category was successfully destroyed.' } 
     format.json { head :no_content } 
    end 
    end 

    private 

    def set_category 
     @category = Category.find(params[:id]) 
    end 

    def category_params 
     params.require(:category).permit(:name, :parent_id) 
    end 

    # Confirms an admin user. 
    def admin_user 
     redirect_to(root_url) unless current_user.try(:admin?) 
    end 

end 

Вот моя категория показать вид.

<p id="notice"><%= notice %></p> 

<div class = "col-md-3"> 
    <h1> 
     <strong><%= @category.name %></strong> 
    </h1> 
</div> 

<div class = "col-md-9"> 
    <div id="tag_cloud"> 
     <% tag_cloud Item.tag_counts, %w[s m l] do |tag, css_class| %> 
     <%= link_to tag.name, tag_path(tag.name), class: css_class %> 
     <% end %> 
    </div> 
</div> 

<div class = "col-md-12"> 
    <div class="line-separator"></div> 
</div> 

<div class = "col-md-12"> 
    <div id="items" class="transitions-enabled"> 
     <% @items.each do |item| %> 
      <div class="box panel panel-default"> 
       <div class="itemlisttitle"><%= item.title %></div>  
      <%= link_to image_tag(item.image.url (:medium)), item %> 
       <div class ="panel-body"> 
       <div class = "itemlistprice">$<%= item.price %></div> 
       <div class = "itemlistretailer"><%= image_tag item.user.avatar(:thumb) %> Retailer: <%= link_to item.user.username, item.user %></div> 
      </div> 
      </div> 
     <% end %> 
    </div> 
</div> 

Вот маршруты. Таким образом, вы можете увидеть, как маршрутизируются теги.

Rails.application.routes.draw do 


     resources :categories 

     get 'password_resets/new' 

     get 'password_resets/edit' 

     get 'sessions/new' 

     resources :users 
     get 'user_items' => 'users#show_user_items' 
     root 'items#home' 
     get 'signup' => 'users#new' 
     get 'show' => 'users#show' 
     get 'login' => 'sessions#new' 
     post 'login' => 'sessions#create' 
     delete 'logout' => 'sessions#destroy' 
     resources :account_activations, only: [:edit] 
     resources :password_resets,  only: [:new, :create, :edit, :update] 

     resources :items 
     get 'items_new' => 'items#new' 

     get 'tags/:tags', to: 'categories#show', as: :tag 

schema.rb

ActiveRecord::Schema.define(version: 20150731101116) do 

    create_table "categories", force: :cascade do |t| 
    t.string "name" 
    t.string "ancestry" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    end 

    add_index "categories", ["ancestry"], name: "index_categories_on_ancestry" 

    create_table "items", force: :cascade do |t| 
    t.string "title" 
    t.decimal "price" 
    t.text  "description" 
    t.datetime "created_at",   null: false 
    t.datetime "updated_at",   null: false 
    t.integer "user_id" 
    t.string "image_file_name" 
    t.string "image_content_type" 
    t.integer "image_file_size" 
    t.datetime "image_updated_at" 
    t.integer "category_id" 
    end 

    add_index "items", ["user_id", "created_at"], name: "index_items_on_user_id_and_created_at" 
    add_index "items", ["user_id"], name: "index_items_on_user_id" 

    create_table "taggings", force: :cascade do |t| 
    t.integer "tag_id" 
    t.integer "taggable_id" 
    t.string "taggable_type" 
    t.integer "tagger_id" 
    t.string "tagger_type" 
    t.string "context",  limit: 128 
    t.datetime "created_at" 
    end 

    add_index "taggings", ["tag_id", "taggable_id", "taggable_type", "context", "tagger_id", "tagger_type"], name: "taggings_idx", unique: true 
    add_index "taggings", ["taggable_id", "taggable_type", "context"], name: "index_taggings_on_taggable_id_and_taggable_type_and_context" 

    create_table "tags", force: :cascade do |t| 
    t.string "name" 
    t.integer "taggings_count", default: 0 
    end 

    add_index "tags", ["name"], name: "index_tags_on_name", unique: true 

    create_table "users", force: :cascade do |t| 
    t.string "username" 
    t.string "email" 
    t.datetime "created_at",       null: false 
    t.datetime "updated_at",       null: false 
    t.string "password_digest" 
    t.string "remember_digest" 
    t.boolean "admin",    default: false 
    t.string "activation_digest" 
    t.boolean "activated",   default: false 
    t.datetime "activated_at" 
    t.string "reset_digest" 
    t.string ">" 
    t.datetime "reset_sent_at" 
    t.string "avatar_file_name" 
    t.string "avatar_content_type" 
    t.integer "avatar_file_size" 
    t.datetime "avatar_updated_at" 
    t.text  "description" 
    end 

    add_index "users", ["email"], name: "index_users_on_email", unique: true 

end 

ответ

1

на самом деле вы отправляете только Params [тег] категорию переключате найти у вас есть, чтобы отправить идентификатор, а также, попробуйте следующее

Изменить

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

Для

<%= link_to tag.name, tag_path(tag.name, id: @category.id), class: css_class %> 

и снова проверить

+0

Вы должны использовать 'tag_path (Тэг: tag.name, ID: tag.id)', потому что это идентификатор тега будучи щелкнули. '@ category.id' - это идентификатор просматриваемого объекта, который не является тем, что вы хотите отправить по ссылке. –

+0

Но даже тогда это может не сработать, потому что вы отправляете два параметра, когда маршрут ожидает только один. –

+0

Спасибо. Это сработало. – joeyk16

0

Когда пользователь нажимает на теге tag.name ставится в качестве параметра и маршрут идет к show действия контроллера categories, называя параметр tags. Действие show имеет набор методов before_action, который пытается найти соответствующий объект Category на основе id, который он получает от параметра, называемого id.

Нет значения параметра id, когда метод set_category запускается после того, как пользователь нажимает на тег.

Изменить метод к этому

def set_category 
    if params[:tag] 
    @category = Category.find_by_name(params[:tag]) 
    end 
    if params[:id] 
    @category = Category.find(params[:id]) 
    end 
end 

С этим кодом шоу действие будет работать, если вы отправите имя тега в качестве параметра называется :tag или идентификатор в качестве параметра называется :id

Смежные вопросы