0

J'espère vraiment que quelqu'un pourra aider Rails n00b avec ce problème. Ces derniers jours, j'ai cherché, essayé, crash (-et-burning) sur la façon d'implémenter la structure d'URL standard/YYYY/MM/Title-Slug pour un blog que je suis en train de mettre en place. J'ai découvert et implémenté avec succès Friendly_Id pour gérer la sluggification (avec le suivi de l'historique), mais pour la vie de moi, je ne peux pas résoudre la partie Année/Mois du problème de routage.Implémentation de la structure d'URL de/YYYY/MM/Title-Slug avec Friendly_Id

Avant que je: J'utilise Rails 4.2.3 et Ruby 2.2.1p85 (parce que, oui, je mis à profit un tas de trucs de RailsTutorial.org) :-)

Afin de minimiser la confusion (ou collatéral dommages), je l'ai échafaudés une application blog super simple à essayer de tout travail:

$ rails new blog 
[...] 
$ cd blog 
# (Add friendly_id to Gemfile & install) 
$ rails generate friendly_id 
$ rails generate scaffold post title content slug:string:uniq 
[...] 
$ rake db:migrate 

a apporté les modifications suivantes à post.rb:

class Post < ActiveRecord::Base 
    extend FriendlyId 
    friendly_id :title, use: :slugged 

    def year 
    created_at.localtime.year 
    end 

    def month 
    created_at.localtime.strftime("%m") 
    end 

end 

posts_controller.rb:

class PostsController < ApplicationController 
    before_action :set_post, only: [:show, :edit, :update, :destroy] 

    def index 
    @posts = Post.order('created_at DESC').all 
    end 

    def show 
    end 

    def new 
    @post = Post.new 
    end 

    def edit 
    end 

    def create 
    @post = Post.new(post_params) 

    respond_to do |format| 
     if @post.save 
     format.html { redirect_to @post, notice: 'Post was successfully created.' } 
     format.json { render :show, status: :created, location: @post } 
     else 
     format.html { render :new } 
     format.json { render json: @post.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    def update 
    respond_to do |format| 
     if @post.update(post_params) 
     format.html { redirect_to @post, notice: 'Post was successfully updated.' } 
     format.json { render :show, status: :ok, location: @post } 
     else 
     format.html { render :edit } 
     format.json { render json: @post.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    def destroy 
    @post.destroy 
     respond_to do |format| 
     format.html { redirect_to posts_url, notice: 'Post was successfully destroyed.' } 
     format.json { head :no_content } 
     end 
    end 

    private 

    def set_post 
     @post = Post.friendly.find(params[:id]) 
    end 

    def post_params 
     params.require(:post).permit(:title, :content, :published_at, :slug) 
    end 
end 

index.html.erb

<p id="notice"><%= notice %></p> 

<h1>Listing Posts</h1> 

<table> 
    <thead> 
    <tr> 
     <th>Title</th> 
     <th>Content</th> 
     <th>Slug</th> 
     <th colspan="3"></th> 
    </tr> 
    </thead> 

    <tbody> 
    <% @posts.each do |post| %> 
     <tr> 
     <td><%= post.title %></td> 
     <td><%= post.content %></td> 
     <td><%= post.slug %></td> 
     <td><%= link_to 'Show', post_date_path(post) %></td> 
     <td><%= link_to 'Edit', edit_post_path(post) %></td> 
     <td><%= link_to 'Destroy', post, method: :delete, data: { confirm: 'Are you sure?' } %></td> 
     </tr> 
    <% end %> 
    </tbody> 
</table> 

<br> 

<%= link_to 'New Post', new_post_path %> 

routes.rb:

Rails.application.routes.draw do 

    get '/posts', to: 'posts#index', as: :posts_path 
    get '/posts/:year', to: 'posts#index', as: :posts_year, 
    constraints: { year: /\d{4}/ } 
    get '/posts/:year/:month', to: 'posts#index', as: :posts_month, 
    constraints: { year: /\d{4}/, month: /\d{1,2}/ } 
    get '/posts/:year/:month/:slug', to: 'posts#show', as: :post_date, 
    constraints: { year: /\d{4}/, month: /\d{1,2}/, slug: /[a-z0-9\-]+/ } 
    resources :posts 
end 

Ces changements sont la plupart du temps de mettre à jour le code Rails3 de ce Stackoverflow Q&A a C'est ce qui m'a le plus éloigné des autres options que j'ai découvertes. Je suis actuellement en cours d'exécution dans le contrôleur suivant Exception:

Showing […]/app/views/posts/index.html.erb where line #24 raised: 

No route matches {:action=>"show", :controller=>"posts", :month=>nil, :slug=>nil, :year=>#<Post id: 23, title: "test", content: "", slug: "test-4", created_at: "2015-09-01 21:05:48", updated_at: "2015-09-01 21:05:48">} missing required keys: [:month, :slug, :year] 

Autres solutions qui ont échoué dans d'autres façons légèrement écraser l'âme:

  • « Rails 4 Blog /: Année/Mois /: Titre avec un routage propre "(voir les commentaires pour le lien) - cela semble ne pas fonctionner à cause d'un)
  • " Rails 4.1.2 - to_param échappe à des barres obliques (et casse l'application) "(voir les commentaires pour le lien) - cela peut fonctionner, mais je n'étais pas capable de traduire la réponse pour mes fins
  • « Friendly_Id limaces avec ids ou dates séparées par des barres obliques » (voir les commentaires pour le lien)

Pour être clair: Je ne suis pas épousai à cette approche - Je suis plus qu'heureux d'aller d'une manière tout à fait différente. Je voudrais juste comme mon dernier blog pour fonctionner comme:

  • http://www.example.com/blog/ (pour l'indice)
  • http://www.example.com/2015/ (pour un indice de 2015 messages)
  • http://www.example.com/2015/09/ (pour un index des postes de Sept'15)
  • http://www.example.com/2015/09/pleeze-help-me (pour un poste individuel)

un grand merci à l'avance!

EDIT

En descendant quelques trous de lapin supplémentaires pour obtenir une solution à cela, je me demande si vous utilisez la réécriture d'URL serait le seul? approche pour ce problème. Mon instinct dit que ça martèle une cheville ronde dans un trou carré (d'autant plus que le blog n'est pas encore en ligne, donc il n'y a aucune chance qu'il y ait des liens pointant vers la structure URL actuelle), mais j'échoue trouver une meilleure alternative.

J'ai trouvé deux options qui pourraient aider à l'approche de réécriture: réfraction (voir commentaires pour le lien) et porte-rewrite (voir commentaires pour le lien)

Quelqu'un at-il des commentaires sur cette approche alternative et/ou ces plugins?

Merci! PS - Il semble y avoir une mise à jour des permissions SO qui nécessitent maintenant au moins 10 réputation d'afficher plus de 2 liens, j'ai donc dû supprimer tous les liens afin de publier cette modification. Je les ai déplacés vers les commentaires afin que je puisse les sauvegarder.

+0

Avez-vous regardé http://stackoverflow.com/questions/25399736/rails-4-blog-year-month-title-with-clean-routing? – mysmallidea

+0

[Rails 4 Blog /: année /: mois /: titre avec routage propre] (http://stackoverflow.com/questions/25399736/rails-4-blog-year-month-title-with-clean-routing) | [Rails 4.1.2 - to_param échappe à des barres obliques (et casse l'application)] (http://stackoverflow.com/questions/25031791/rails-4-1-2-to-param-escapes-slashes-and-breaks-app/ 26267426 # 26267426) | [Friendly_Id limaces avec des ID ou des dates séparées par des barres obliques] (http://stackoverflow.com/questions/21290488/friendly-id-slugs-with-ids-or-dates-separated-by-slashes/27349582#27349582) –

+0

[ Réfraction plugin] (https://github.com/joshsusser/refraction) | Rack-rewrite plugin] (https://github.com/jtrupiano/rack-rewrite) –

Répondre

0

J'ai une solution partielle qui peut être visualisée dans un new question que je viens de créer. L'index et les messages individuels rendent comme souhaité, mais je rencontre des problèmes lors de la création & postes d'édition et je n'ai pas de solution pour les index annuels e.g., http://www.example.com/2015/ et les index mensuels e.g., http://www.example.com/2015/09/.

Un complément d'information sur la résolution de ces problèmes en suspens à la nouvelle question serait vraiment appréciée!

Une implémentation de travail complète peut être trouvée dans la réponse acceptée de this subsequent question.