Невозможно изменить параметр с идентификатора на пользовательскую переменную в Rails

Я ломал голову, пытаясь понять что-то, что должно быть чрезвычайно простым, поэтому я уверен, что просто что-то упускаю из виду, и свежий взгляд может быть полезен, поскольку весь мой код, похоже, сливается воедино. Я пытаюсь создать тщеславные URL-адреса для сайта, который позволяет пользователям создавать категории, а затем публиковать соответствующие истории на основе этих категорий. Так, например, я хотел бы, чтобы пользователи имели доступ к /categories/movies для просмотра раздела фильмов. Если я настрою его на использование идентификатора категории /categories/1, он работает без проблем. По какой-то причине rails продолжает пытаться использовать параметр id для поиска категории, а не параметр title. Я использую Ruby 2.0.0 и Rails 4.0. Я читал, что метод find_by скоро станет устаревшим, поэтому, если есть лучший способ справиться с этим, это было бы здорово. Вот соответствующий код:

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

def show
 @categories = Category.find_by_title(params[:title])
 @category = Category.find_by_title(params[:title])
 @posts = Post.where(category: set_category).all
end

Маршруты.рб

resources :categories

get "/categories/:title" => "categories#show"

Считывание терминала при рендеринге страницы

Processing by CategoriesController#show as HTML
Parameters: {"id"=>"Movies"}

Просто повторюсь, параметры должны читаться как {"title"=>"Movies"}, а не id. Как я уже сказал, я уверен, что это что-то чрезвычайно простое, что я упустил из виду. Любая помощь будет оценена по достоинству. Спасибо.


person user1411453    schedule 20.11.2013    source источник


Ответы (1)


Мне также пришлось внедрить тщеславные URL-адреса и следовать этому сообщению/учебнику в блоге.

Вы в значительной степени создаете слаг в своей модели с тщеславным URL-адресом, поэтому

class Category < ActiveRecord::Base

  def slug
    title.downcase.gsub(" ", "-")  
  end

  def to_param
    "#{slug}"
  end

end

Ваше действие show в вашем контроллере будет использовать метод find_by_slug

Я думаю, что есть жемчужина, которая также делает это, называется friendly_id, и вот railscast, но лично я им не пользовался.

Надеюсь это поможет

person strivedi183    schedule 20.11.2013
comment
Сработало прекрасно, я знал, что упустил из виду, просто забыл добавить def to_param. Спасибо! - person user1411453; 20.11.2013