2016-08-31 3 views
0

Ich habe eine RoR-App. Und in der App können Benutzer Beiträge erstellen. Ich habe Post-Tabelle in meinem routes.rb über resources :posts verbunden. Und jetzt - Link zum erstellten Beitrag sehen aus wie: http://mysitename.com/posts/1 (wo 1 ist Post-Nummer).Schienen, wie automatisch generierten Link zu ändern

Was ich tun möchte, ist, um Schienen Link zu Post zu erzeugen. Die Benutzer haben also nicht gesehen, wie viele Beiträge ich in meiner Datenbank habe. Und als Ergebnis muss es wie http://mysitename.com/post/generatedlink aussehen. Es muss beispielsweise Post-Theme generieren.

Für den Anfang müssen wir link Spalte in Posts Tabelle erstellen. Und machen Sie es so etwas zu erzeugen:

@post.link = @post.theme.parameterize.underscore 

Aber ich verstehe nicht, wo diesen Code zu setzen.

Und das nächste Problem ist: "Wie post/1 für @post.link ersetzen?"

Hoffe, ich mache mir selbst klar. Wenn Sie sagen, dass ich Informationen bereitstellen kann, was ist erforderlich, um meine Frage zu lösen.

UPDATE

Was ich nach @SteveTurczyn beraten hat.

Ich habe eine neue Spalte namens random_link als string erstellt.

Ich hatte keinen Kontakt mit meiner routes.rb:

resources :posts 

Mein post.rb (post-Modell) wie folgt aussehen:

after_validation :add_link 

def add_link 
    self.random_link = self.theme.to_slug_param 
    # to_slug_param it's a gem for translating from other language into english 
end 

def to_param 
    random_link 
end 

ich nicht find-Methode haben. Mein posts_controller.rb sieht wie folgt aus:

def show 
    @post = Post.find_by_random_link(params[:id]) 
    right_menu_posts 
    random_link_to_other_post(@post) 
end 

    private 

    def random_link_to_other_post(post) 
    random_post = Post.where.not(id: post.id) 
    @random_post = random_post.sort_by {rand}.first 
    end 

    def right_menu_posts 
    @posts_for_video_in_right_menu = Post.where(video: true) 
    end 

Und html.erb:

<%= @post.theme %> 
<%= @post.content %> 

<% for post in @random_post %> 
    <%= link_to post %> 
<% end %> 
<% for post in @posts_for_video_in_right_menu %> 
    <%= link_to post %> 
<% end %> 

Und auf einer Hauptseite (wo ich habe eine Liste der Veröffentlichungen) einen keep einen Fehler bekommen: NoMethodError in Home#index private method 'to_param' called for #<Post:0x007fae3096bf78>.

+0

vielleicht betrachten Sie dieses Juwel: https://github.com/norman/friendly_id Allerdings ist es zu lernen, wie es ohne ein Juwel zu tun, es wert, zu lernen, da es nicht so schwierig zu implementieren ist. –

+0

Sie sollten 'to_param' nicht im privaten Teil Ihrer Modelldefinition haben. Ich habe meine Antwort geändert, um das zu verdeutlichen. – SteveTurczyn

Antwort

3

ist die Technik als slugifying und Sie müssen genannte drei Dinge tun ...

(1) ein neues Feld slug in Ihrer posts Tabelle mit dem Namen erstellen.

(2) fügen Sie diesen Code in Ihre Post Modell ...

after_validation :generate_slug 

private 

def generate_slug 
    self.slug = theme.parameterize.underscore 
end 

public 

def to_param 
    slug 
end 

(3) schließlich in Ihrem Controller, auf denen Sie find_post Methoden haben, schreiben sie zu sein ...

def find_post 
    Post.find_by_slug(params[:id]) 
end 

Die to_param Methode im Modell ist, wie Dinge wie post_path(@post) bauen die URL ...die to_param wenn nicht ersetzt das id Feld, aber indem Sie Ihre eigene to_param Methode schreiben können Sie sicherstellen, dass das slug Feld stattdessen ersetzt wird.

Stellen Sie sicher, dass "to_param" eine öffentliche Methode ist! Legen Sie es nicht in den privaten Teil Ihres Modells. Sie können das tun, indem Sie public unmittelbar vor der to_param Methode setzen. Sie sollten dann nach der Methodendefinition private setzen, wenn nachfolgende Methoden privat sein sollen.

+0

Ich verstehe es. Netter Weg. Aber als Ergebnis link_to Tag arbeiten jetzt anders. Zum Beispiel: es war '<% = link_to @post%>', aber jetzt funktioniert es so: '<% = link_to @ post.slug%>' (in meiner App ist es @ post.random_link'). Kannst du mir helfen, wie ich es beheben kann? –

+0

Nein, Sie können immer noch "link_to @ post" wegen der to_param Änderung – SteveTurczyn

+0

Zur Frage, welches Problem erscheint –

Verwandte Themen