Почему Friendly_id работает в одном действии и не работает в другом

StackOverflow https://stackoverflow.com//questions/23050444

  •  21-12-2019
  •  | 
  •  

Вопрос

У меня есть несколько настраиваемых действий в моем orders_controller.rb:

class OrdersController < ApplicationController
  def process_payment
    @order = Order.friendly.find(params[:id])
    [snip]
    binding.pry_remote # drops into the terminal here for debugging
    redirect_to order_path(@order)
    [snip]
  end
end

Testivate::Application.routes.draw do
  resources :orders do
    member do
      get :pay
      post :process_payment
    end
  end
end

Я вижу в терминале, что внутри @order#process_payment действие, friendly_id работает:

[1] pry(#<OrdersController>)> @order
+----+-------+-------+------+------+------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
| id | co... | url   | comp | comp | comp | us... | gu... | gu... | cr... | up... | pr... | uuid  | sp... | payed |
+----+-------+-------+------+------+------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
| 1  | Th... | ht... | http | http | http | 1     |       |       | 20... | 20... | 1     | ee... | true  | false |
+----+-------+-------+------+------+------+-------+-------+-------+-------+-------+-------+-------+-------+-------+
1 row in set
[2] pry(#<OrdersController>)> @order.uuid
=> "ee1bbe01-e1ca-420c-991b-76ce90525cf8"
[3] pry(#<OrdersController>)> request.original_url
=> "http://127.0.0.1:4000/orders/ee1bbe01-e1ca-420c-991b-76ce90525cf8/process_payment"
[4] pry(#<OrdersController>)> order_path(@order)
=> "/orders/ee1bbe01-e1ca-420c-991b-76ce90525cf8"

Но когда @order#process_payment пытается перенаправить на @order#show, это терпит неудачу.

Я получаю ошибку:

ActiveRecord::RecordNotFound at /orders/ee1bbe01-e1ca-420c-991b-76ce90525cf8
Couldn't find Order with id=ee1bbe01-e1ca-420c-991b-76ce90525cf8

Но, как ни странно, эта ошибка, похоже, возникает до того, как Rails попытается завершить @order#show, поскольку он никогда не падает на терминал внутри моего @order#show действие:

class OrdersController < ApplicationController
  def show
    binding.pry_remote # should drop down to terminal here for debugging, but we never get this far
    @order = Order.friendly.find(params[:id])
    respond_with @order
  end
end

Почему это?

Другой потенциально релевантный код:

class Order < ActiveRecord::Base
  extend FriendlyId
  friendly_id :uuid
  after_create :generate_uuid  
  def generate_uuid
    self.update_attributes :uuid => SecureRandom.uuid
  end
end

Использование Rails 4.0.2 и Friendly_id 5.0.3.

Это было полезно?

Решение

Вам захочется посмотреть на это:

friendly_id :uuid, use: [:slugged, :finders]

Это в основном устанавливает значение по умолчанию find метод Rails для поиска как стандартного id и slug.Я думаю, это решит твою проблему

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top