0

Я действительно надеюсь, что кто-то сможет помочь этому Rails n00b с этой проблемой. За последние несколько дней я исследовал, пытался, сбой (-и-горения) о том, как реализовать стандартную структуру URL-адресов/YYYY/MM/Title-Slug для блога, который я собираю. Я обнаружил и успешно реализовал Friendly_Id для обработки sluggification (наряду с отслеживанием истории), но для жизни я не могу решить проблему Года/Месяца проблемы маршрутизации.Реализация/YYYY/MM/Title-Slug Структура URL с Friendly_Id

Прежде, чем я забуду: Я использую Rails 4.2.3 и Ruby, 2.2.1p85 (потому что, да, я использовала кучу вещей из RailsTutorial.org) :-)

Чтобы минимизировать путаницу (или залога повреждение), я scaffolded супер-простое приложение блога, чтобы попытаться получить все это работать:

$ 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 

сделал следующие изменения в 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 

Эти изменения в основном от обновления кода Rails3 от этого Stackoverflow Q&A a который получил меня самым дальним из других вариантов, которые я обнаружил. Я в настоящее время работает в следующем 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] 

Другие решения, которые не смогли в других немного соул дробления способов:

  • «Rails 4 Блог /: год /: месяц /: названию с чистой маршрутизацией »(см. комментарии к ссылке) - это, похоже, не работает из-за 4.1.2 bug that appears to never having been fixed)
  • « Rails 4.1.2 - to_param escapes slashes (и breaks app) »(см. комментарии для ссылки) - это может работать, но я не смог перевести ответ для своих целей
  • «Friendly_Id слизней с идентификаторами или датами, разделенных косой чертой» (см комментарии для ссылки)

Чтобы было ясно: я не предан этому подходу - я более чем счастлив пойти совершенно другим путем. Я бы так же, как мой последний блог функционировать как:

  • http://www.example.com/blog/ (для индекса)
  • http://www.example.com/2015/ (для индекса 2015 сообщений)
  • http://www.example.com/2015/09/ (для индекса сообщений от Sept'15)
  • http://www.example.com/2015/09/pleeze-help-me (для отдельного поста)

Большое спасибо заранее!

EDIT

В спускаясь некоторые дополнительные отверстия кролика, чтобы получить решение этой проблемы, я интересно, если с помощью URL переписывания будет единственным? подход к этой проблеме. Моя кишка говорит, что она колотит круглую привязку в квадратную дыру (особенно учитывая, что блог еще не жив, поэтому нет никаких шансов, что в дикой природе есть ссылки, указывающие на текущую структуру URL), но я терпеть неудачу чтобы найти лучшую альтернативу.

Я нашел два варианта, которые могли бы помочь с переписывания подхода: рефракции (см комментарии для ссылки) и стойки-перезапись (см комментарии для ссылки)

Кто-нибудь есть какие-либо материалы по этому альтернативному подходу и/или эти плагины?

Спасибо!

PS - Появляется обновление для разрешений SO, для которых теперь требуется не менее 10 репутаций для размещения более двух ссылок, поэтому мне пришлось удалить все ссылки, чтобы опубликовать это изменение. Я переместил их в комментарии, чтобы сохранить сохраненное редактирование.

+0

Вы посмотрели http://stackoverflow.com/questions/25399736/rails-4-blog-year-month-title-with-clean-routing? – mysmallidea

+0

[Rails 4 Блог /: год /: месяц /: название с чистой маршрутизацией] (http://stackoverflow.com/questions/25399736/rails-4-blog-year-month-title-with-clean-routing) | [Rails 4.1.2 - to_param сбрасывает слэши (и прерывает приложение)] (http://stackoverflow.com/questions/25031791/rails-4-1-2-to-param-escapes-slashes-and-breaks-app/ 26267426 # 26267426) | [Friendly_Id slugs с идентификаторами или датами, разделенными слэшами] (http://stackoverflow.com/questions/21290488/friendly-id-slugs-with-ids-or-dates-separated-by-slashes/27349582#27349582) –

+0

[ Плагин рефракции] (https://github.com/joshsusser/refraction) | Rack-rewrite plugin] (https://github.com/jtrupiano/rack-rewrite) –

ответ

0

У меня есть частично работающее решение, которое можно просмотреть в new question Я только что создал. Индекс и отдельные сообщения отображают по желанию, но я столкнулся с проблемами при создании & редактирующих сообщений, и у меня нет решения для ежегодных индексов e.g., http://www.example.com/2015/ и ежемесячных индексов e.g., http://www.example.com/2015/09/.

Дополнительная информация о решении этих нерешенных вопросов по новому вопросу была бы действительно оценена!

Полная, рабочая реализация может быть найдена в принятом ответе this subsequent question.

Смежные вопросы