Rails Friendly Id – не удалось найти категорию с id=electronics

Я пытаюсь разработать приложение на Ruby on Rails 4.0 (уже использовал более старые версии этого невероятного фреймворка), и у меня возникли некоторые проблемы.

Я установил гем FriendlyID и думаю, что все в порядке, но при попытке протестировать приложение возникают ошибки.

Если я перейду к http://0.0.0.0:3000/categories/1, это сработает. Но когда я нажимаю «редактировать» на этой странице или просто перехожу к http://0.0.0.0:3000/categories/electronics (это сокращенное название категории с идентификатором 1), я получаю следующую ошибку:

Couldn't find Category with id=electronics
# Use callbacks to share common setup or constraints between actions.
def set_category
   @category = Category.find(params[:id])  #Here's pointed the error
end

Модель категории:

class Category < ActiveRecord::Base 

    extend FriendlyId
    friendly_id :name, use: :slugged

    # Validations
    validates_uniqueness_of :name, :case_sensitive => false

end

Контроллер категории:

(сгенерировано скаффолдом для тестовых целей)

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

  # GET /categories
  # GET /categories.json
  def index
    @categories = Category.all
  end

  # GET /categories/1
  # GET /categories/1.json
  def show
  end

  # GET /categories/new
  def new
    @category = Category.new
  end

  # GET /categories/1/edit
  def edit
  end

  # POST /categories
  # POST /categories.json
  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 action: 'show', status: :created, location: @category }
      else
        format.html { render action: 'new' }
        format.json { render json: @category.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /categories/1
  # PATCH/PUT /categories/1.json
  def update
    respond_to do |format|
      if @category.update(category_params)
        format.html { redirect_to @category, notice: 'Category was successfully updated.' }
        format.json { head :no_content }
      else
        format.html { render action: 'edit' }
        format.json { render json: @category.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /categories/1
  # DELETE /categories/1.json
  def destroy
    @category.destroy
    respond_to do |format|
      format.html { redirect_to categories_url }
      format.json { head :no_content }
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_category
      @category = Category.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def category_params
      params.require(:category).permit(:name)
    end
end

Миграция:##

(Я добавил friendlyId после создания таблицы категорий, но я думаю, что это нормально)

class AddColumnToCategory < ActiveRecord::Migration
  def change
    add_column :categories, :slug, :string
    add_index :categories, :slug, unique: true
  end
end

Маршруты:

resources :categories

Надеюсь, вы можете мне помочь. Что я делаю неправильно в Rails 4.0?


person Paladini    schedule 01.12.2013    source источник


Ответы (2)


Проверьте документ, дружественный идентификатор прекратил взлом метода find (для общего блага), теперь у вас есть сделать:

# Change Category.find to Category.friendly.find in your controller
Category.friendly.find(params[:id])
person apneadiving    schedule 01.12.2013
comment
Я должен изменить каждый .find() в моем контроллере или только в set_category? Другое дело, что такое set_category, можете ли вы разместить ссылку на эту «вещь»? - person Paladini; 01.12.2013
comment
каждый find связанный с дружественным идентификатором - person apneadiving; 01.12.2013
comment
нет, это генерируется эшафотом, и я не знаю, почему этот метод существует - person Paladini; 01.12.2013
comment
Это работает, спасибо (: (Но до сих пор не знаю, почему этот метод существует) - person Paladini; 01.12.2013
comment
ну да ладно, это просто удобный способ избежать дублирования - person apneadiving; 01.12.2013
comment
Да, это работает хорошо, и теперь нам нужно внести изменения в отдельный метод каждой модели. - person nehra; 23.06.2016

Теперь вы можете использовать:

extend FriendlyId friendly_id :name, use: [:finders]

в вашей модели.

person Bogdan Popa    schedule 21.04.2015
comment
Спасибо, это лучшее решение, чем принятый ответ - person Batman; 15.08.2015