无法找到带有'id'=的类别

时间:2015-08-03 10:31:07

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-4

我的类别显示视图中显示了标签。当有人查看手机类别时,他们会看到顶部的标签,如iphone,apple,16gb,black等。当有人点击16gb时,它应该显示标有16gb的所有项目。

当有人点击某个代码时,我会收到此错误。

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

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

我无法弄清楚如何修复它?

我正在使用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

2 个答案:

答案 0 :(得分:1)

您没有将类别ID传递到<a href="pages/profile.html">profile</a> 路径,请将您的路线修改为:

tags/:tags

观点:

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

更新

  

当我点击标签时,类别显示视图会加载网址   localhost:3000 / tags / 16gb / 1哪个好。但它仍然显示了所有   项目。让我说我点击16gb。它仍然显示所有移动设备   类别中的移动,当它应该只显示16gb   标记。有线索吗?

修正你的节目动作:

<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, @category.id), class: css_class %>
      <% end %>
    </div>
</div>

答案 1 :(得分:0)

您的params[:id]为空。您应该将tags路径放在categories资源:

resources :categories
  member do
     # run 'rake routes' to check
     # the URL would be something like 'categiries/1/tags/16gb'
     get 'tags/:tag'
  end
end

或者您应该在控制器中将params[:id]更改为params[:category_id],并在创建网址时使用该参数:

# in your index.html.erb or somewhere where you generate URLs which lead to 'show' action
tag_path(tag.name, category_id: tag.category.id)