8 Stimmen

Überschreibung von Rails to_param?

Wie bringe ich die to_param-Methode dazu, immer Schlüsselwort-Slugs zu liefern? Ich habe Probleme, es mit dieser Route zum Laufen zu bringen:

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

Zuvor funktionierte das überschriebene to_param für

Artikel/1-Kaschmirschal'.

scheitert aber bei 'auction/123/item/1'

Aktualisierung:

Ich bin mir nicht sicher, ob die Syntax korrekt ist[(edit: es ist korrekt: es funktioniert :-)], oder sogar effizient.... aber mit haml habe ich herausgefunden, dass der folgende Code funktioniert, um den gewünschten Link zu erzeugen ('auction/:auction_id/item/: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)

8voto

maurycy Punkte 1475

Ich bin mir nicht sicher, ob ich Ihre Frage verstehe. (hier ist es 3:41 Uhr)

Soweit ich das sehe, haben Sie direkten Zugriff auf auction_id Methode, statt der Verwendung von pike_path(auction, item) Das würde die #to_param .

Außerdem könnte es scheitern bei auction/123/item/1 weil Sie Ihren Controller nicht geändert haben.

Ich denke, es wäre hilfreich, zu beschreiben, wie man funktionierende Schnecken bekommt.

Generell gilt: Wenn Sie die #to_param IDs funktioniert nicht mehr. Es bedeutet, dass, wenn Sie mit Slugs gehen, jedes Mal polymorphe URL generiert wird (zB, link_to object, object ), wird der Wert von to_param übergeben. Es ist zu beachten, dass Sie auch Ihren Controller ändern müssen.

Ich persönlich denke, dass der beste Weg, um Slugs einfach zu generieren, die Verwendung von Techno-weenie's permalink_fu und fügte hinzu has_permalink zu Ihrem Modell hinzufügen, und dann to_param . Zum Beispiel

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

Angenommen, Sie haben ein String-Feld (Slug) und möchten Ihren Titel mit einem Slug versehen.

Sie müssen auch Ihren Controller anpassen:

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

Dann können Sie in den Ansichten auf diese Weise Routen erstellen:

link_to @action, @action

Übrigens, Sie sollten Ihre Aktionen NICHT in der Ansicht sortieren. Der beste Weg ist die Verwendung von named_scope .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X