#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
.