Проблема с «to_param» в rails

#ruby-on-rails #ruby-on-rails-3

#ruby-on-rails #ruby-on-rails-3

Вопрос:

У меня есть модель страницы, которую я хочу найти с помощью дескриптора, который я создаю из заголовка.

 class Page < ActiveRecord::Base
  belongs_to :user

  validates_presence_of :title

  def to_param
    handle
  end

  def self.make_url_safe(string)
    handle = string.titleize.gsub(/ /,'').underscore.dasherize[0..35] 
    "#{handle}/" 
  end

end
  

В моем контроллере у меня есть:

 def show
    @page = Page.find_by_handle(params[:id])
 end
  

Я делаю то же самое с другой моделью, и она работает нормально, но не с Page. Я продолжаю получать эту ошибку:

 ActiveRecord::RecordNotFound in
PagesController#show

Couldn't find Page with ID=test
  

Где test — дескриптор страницы. Я чувствую, что это работало всего несколько дней назад, когда я создавал модель, поэтому не уверен, что могло измениться, чтобы вызвать проблему. Может быть, завершающий / ?

Вот журнал:

 Started GET "/pages/test" for 127.0.0.1 at 2011-05-28 11:53:49 -0400
  Processing by PagesController#show as HTML
  Parameters: {"id"=>"test"}
  Page Load (0.2ms)  SELECT "pages".* FROM "pages" WHERE ("pages"."id" = 0) LIMIT 1
Completed   in 12ms

ActiveRecord::RecordNotFound (Couldn't find Page with ID=test):
  

Комментарии:

1. Похоже, что перед фильтром выполняется один. У вас есть что-нибудь установленное в контроллере?

2. Cancan load_and_authorize действительно загружает данные, приводящие к такого рода ошибкам.

3. Да, я действительно использую CanCan. Теперь я вспоминаю, что у меня была такая проблема с другой моделью.

4. К вашему СВЕДЕНИЮ: в Rails есть, parameterize который в основном предназначен для того, что вы пытаетесь сделать с вашей причудливой titleize.underscore.dasherize цепочкой `

Ответ №1:

Я опубликую ответ, хотя он был дан в комментарии выше: CanCan мешает to_param — решение состоит в том, чтобы авторизовать каждый ресурс в контроллере вместо использования универсального load_and_authorize_resources .