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.
Avez-vous regardé http://stackoverflow.com/questions/25399736/rails-4-blog-year-month-title-with-clean-routing? – mysmallidea
[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) –
[ Réfraction plugin] (https://github.com/joshsusser/refraction) | Rack-rewrite plugin] (https://github.com/jtrupiano/rack-rewrite) –