friendly_id gem friendly url не работает для 1 модели, но работает для других? - PullRequest
0 голосов
/ 08 января 2019

Проблема : Я установил гем friendly_id, он работает так, как предполагалось для моей таблицы Users, но для моей модели листингов дружественный URL-адрес использует: name вместо: id isn ' т работает.

Вот мой контроллер списков в двух словах :

    def show
        @order = @listing.orders.new()
#as you can see, I have no need for a find because i noticed i didn't need it for the show page to show up correctly - idk
    end

    private

    def set_listing
          @listing = Listing.find(params[:id])
    end

Что меня смущает, так это то, что мне даже не нужно что-то вроде @listing=Listing.find(params[:id]

Я пытался использовать это в шоу : @listing=Listing.friendly.find(params[:id]

но это не имело значения. Я также попытался изменить метод set_listing, чтобы включить дружественный фрагмент, но это тоже не помогло - просто выстрел, хотя он не должен работать.

Я включил это в модель - так же, как я сделал для своей таблицы Users :

extend FriendlyId
  friendly_id :name, use: :slugged

Например, у меня есть мой листинг, id: 1, имя: Тест листинга 1, slug: list-test-1

Я захожу на domain.com/listings/listing-test-1 и получаю

Не удалось найти листинг с 'id' = list-test-1

Я сделал все то же самое, что и с таблицей Users, но, похоже, она не работает.

Вопрос : Есть ли что-то, что может помешать этой проблеме?

1 Ответ

0 голосов
/ 08 января 2019

FriendlyId не переопределяет метод по умолчанию .find в вашей модели. Ну, по крайней мере, не так как версия 5 была выпущена еще в 2013 году.

Для поиска записи на основе столбца id и slug вам необходимо явно вызвать .friendly.find:

class ListingsController < ApplicationController

  before_action :set_listing, only: [:show, :edit, :update, :destroy]

  # ...

  def show
    @order = @listing.orders.new()
  end

  # ...

  private

  def set_listing
    @listing = Listing.friendly.find(params[:id])
  end

  # ...
end

Причина, по которой вы в настоящее время получаете ошибку, заключается в том, что before_action :set_listing вызывает метод set_listing до вызова действия show.

class ListingsController
  before_action :set_listing, only: [:show, :edit, :update, :destroy]

  def show
    # this line is never reached - and should not really be needed anyways
    @listing = Listing.friendly.find(params[:id])
    @order = @listing.orders.new()
  end

  private

  def set_listing
    # will raise ActiveRecord::NotFoundError
    @listing = Listing.find(params[:id])
  end
end

Поскольку Listing.find(params[:id]) поднимет ActiveRecord::NotFoundError, вы никогда не достигнете действия шоу. Решение состоит в том, чтобы просто исправить метод обратного вызова.

...