充当可标记错误

时间:2015-08-24 11:43:42

标签: ruby-on-rails

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

我已经在这个错误上工作了12个小时而且无法修复它。

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

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)

实际上你只发送了params [:tag]但是要找到你必须发送id的类别,请试试

更改

<%= 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 %>

再次检查

答案 1 :(得分:0)

当用户点击代码时,tag.name作为参数放置,路由转到show控制器的categories操作,并命名参数tagsshow操作设置了before_action方法,该方法会尝试根据从Category参数中获取的id来查找相关的id对象。< / p>

在用户点击代码后运行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作为名为:id

的参数发送,则show动作将起作用