Переопределение Rails to_param? - PullRequest
       4

Переопределение Rails to_param?

8 голосов
/ 21 декабря 2008

Как мне получить метод to_param для постоянной доставки слагов ключевых слов? У меня проблемы с настройкой этого маршрута:

map.pike '/ auction /: auction_id / item /: id',: controller => 'items',: action => 'show'

Ранее переопределенный to_param работал для

'элементы / 1-кашемир-шарф'

, но не с 'auction/123/item/1'

Обновление:

Я не уверен, правильный ли синтаксис [(edit: он правильный: он работает :-)], или даже эффективный .... но используя haml, я обнаружил, что следующий код работает для генерации желаемой ссылки ( 'аукцион /: auction_id / пункт /: идентификатор')

- for auction in @auctions.sort{|a, b| a.scheduled_start <=> b.scheduled_start}
  -for item in @items
    - unless auction.current_auction
      ... pike_path(auction.auction_id, item)

1 Ответ

8 голосов
/ 23 декабря 2008

Я не уверен, что понимаю ваш вопрос. (сейчас 3:41 утра)

Из того, что я вижу, вы напрямую получаете доступ к методу auction_id, вместо использования pike_path(auction, item), который будет использовать #to_param.

Также может произойти сбой для auction/123/item/1, потому что вы не изменили свой контроллер.

Думаю, было бы полезно описать, как получить рабочих слизней.

Вообще говоря, если вы переопределите #to_param, идентификаторы больше не будут работать. Это означает, что если вы используете slugs, каждый раз, когда генерируется полиморфный URL (например, link_to object, object), он передает значение to_param. Стоит отметить, что вы также должны изменить свой контроллер.

Лично я считаю, что лучший способ легко создавать слагов - это использовать permalink_fu от techno-weenie, добавив has_permalink к вашей модели, а затем переопределить to_param. Например

class Auction < ActiveRecord::Base
  has_permalink :title, :slug
end

при условии, что у вас есть слаг, строковое поле и вы хотите поставить заголовок на слаг.

Вам также необходимо настроить контроллер:

class AuctionsController < ApplicationController
  def show
    @auction = Auction.find_by_slug(params[:id]) || raise(ActiveRecord::RecordNotFound)

    respond_to do |format|
      format.html # show.html.erb
    end
end

Затем вы можете создавать маршруты в представлениях следующим образом:

link_to @action, @action

Кстати, вы НЕ должны сортировать свои действия в представлении. Лучше всего использовать named_scope.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...