2017-02-07 1 views
0

Ich habe Setup Friendly Id nach all den Anweisungen aus den Home page bereits sinnvoller URLs für Ähnliche Namen zu erzeugen.Freundlich id Verwendung mit verschiedenen Slug Werte- Rails 4

Kurz gesagt, ich habe die module und slug Spalt in meiner Platz Modell Tabelle hinzugefügt.

in meinem place.rb

extend FriendlyId 
    friendly_id :name, use: [:slugged, :finders, :history] 

Ich lief auch Place.find_each(&:save).

nun der Wert von name kann unterschiedlich sein, da es viele Orte mit gleichen names.So im Index Aktion ist, wenn ich die Show Aktion nennen, mit id, erhält ich korrekte Ergebnisse aber Urls sieht schlecht aus, aber wenn i call show action mit friendly_id, url ist auch hier schlecht mit seinem uniq token wie string angehängt und auch ich bekomme immer falsches ergebnis.

zum Beispiel. Für einen Datensatz mit name Wert als Burwood können mehrere Einträge vorhanden sein too.However, gibt es zwei Probleme: -

  1. Meine Urls wie www.mysite/sydney/burwood statt www.mysite/sydney/21 sein sollte, wenn ich id verwende und nicht friendly_id (das sieht komisch aus - www.mysite/sydney/burwood-78894aa3-dea1-4915-b2f7-038182511005), wie man damit umgeht. ??
  2. Wenn i Id Verwendung nicht und friendly_id als URL-Parameter verwenden, für Ähnliche Standorte Wert Burwood, ich bin immer erste Datensatz erhalten, auch wenn ich für andere one.So in DB bin zu fragen, name Wert von burwood mit zwei Datensätze sind meine slug Werte unterschiedlich - burwood und burwood-78894aa3-dea1-4915-b2f7-038182511005

Also, wenn Gebrauch ID als uRL-Parameter, es funktioniert als ids sind uniq und Schnecken sind nicht berücksichtigt, aber ich will url mehr sinnvoll sein.

Wenn jedoch i friendly_id verwenden, URL sieht seltsam und auch einzigartiger Datensatz wird nicht abgeholt.

freundlicher

Antwort

0

helfen Wenn viele Orte mit dem gleichen Namen gibt, dann wird friendly_id bis zum Ende des Rohlings ein guid hängen Sie ihn einzigartig zu machen.

Sie können mit friend_id Kandidaten versuchen:

Aus der Dokumentation:

Eine neue „Kandidaten“ Funktionalität, die es einfach macht, eine Liste alternativer Schnecken einzurichten, die eindeutig verwendet werden können, zu unterscheiden Datensätze, anstatt eine Sequenz anzuhängen.Zum Beispiel:

class Restaurant < ActiveRecord::Base 
    extend FriendlyId 
    friendly_id :slug_candidates, use: :slugged 

    # Try building a slug based on the following fields in 
    # increasing order of specificity. 
    def slug_candidates 
    [ 
     :name, 
     [:name, :city], 
     [:name, :street, :city], 
     [:name, :street_number, :street, :city] 
    ] 
    end 
end 

https://github.com/norman/friendly_id

Alternativ können Sie Ihre eigenen Schnecke rollen durch to_param im Place Modell überschreiben und einen before_validation Filter mit der Schnecke zu setzen.

before_validation :format_slug 

def to_param 
    slug 
end 

private 

def format_slug 
    self.slug = "#{name} #{id}".parameterize 
    # You can define any rules for your slug here. 
end 

Und wenn Sie die params wollen [: id] [: Slug] params lesen in der Steuerung statt, dann setzen Sie param: :slug in Ihre Routen.

resources :places, param: :slug 

Und in Ihrem Controller:

Place.find_by(slug: params[:slug]) 
+0

Ich kann dies erreichen, indem to_param verwenden, aber wie kann ich meine Urls recht machen .Ich möchte nicht meine Id in den URLs zeigen ... – Milind

+0

Sie? kann eine 'guid'-Spalte hinzufügen und eine eindeutige ID mit' SecureRandom.hex (4) 'generieren, um eine zufällige eindeutige Zeichenfolge/ID zu erstellen. Die Länge ist das Doppelte des Wertes, also 8 Zeichen lang, wenn wir den Wert 4 verwenden. – codyeatworld

+0

Ich kann ein Beispiel hinzufügen, wenn Sie möchten. – codyeatworld

Verwandte Themen