2016-12-09 9 views
0

В настоящее время я создаю веб-сайт, который позволит посетителю читать журнал в Интернете. Я создал эшафот для самого журнала, а другой - для страниц, которые принадлежат журналу. Таким образом, я могу создать многостраничную загрузку для страниц при создании журнала, и все будет загружено в одно и то же время.Передайте другие данные, кроме ID в URL

Когда я гнездятся на страницы ресурсов внутри ресурсов журнала, следующим образом:

resources :magazines do 
    resources :pages 
end 

я получаю «domain.com/magazines/<slug>/pages/id»

Однако, у меня были некоторые проблемы с идентификатором, потому что оно не может быть используется для подсчета страниц (поскольку идентификатор никогда не возвращается к 1), поэтому я создал функцию внутри контроллера, которая будет считать страницы для меня, и сохранит каждую страницу со значением «page_number».

Мой вопрос следующий: как вместо идентификатора я могу попросить мой маршрутизатор использовать: page_number? Я пытался создать пользовательский маршрут, который выглядел как этот

resources :magazines do 
    get '/:page_number' => 'pages#show', as: :custom_page 
end 

Но по неизвестной причине, Rails говорит мне, что мой пользовательский путь просто не существует, даже если она существует, когда я печатаю rake routes

Спасибо заранее

Редактировать

Вот мой magazine_controller.rb

class MagazinesController < ApplicationController 
    before_action :authenticate_user!, only: [:edit, :update, :destroy] 
    before_action :set_magazine, only: [:show, :edit, :update, :destroy] 

    def index 
    @magazines = Magazine.all 
    end 

    def show 
    end 

    def new 
    @magazine = Magazine.new 
    end 

    def edit 
    end 

    def create 
    @magazine = Magazine.new(magazine_params) 

    if @magazine.save 
     if params[:images] 
     (params[:image] || []).each_with_index do |image, index| 
      @magazine.pages.create(image: image, page_number: index + 1) 
     end 
     redirect_to @magazine, notice: 'Magazine was successfully created.' 
    else 
     render :new 
     end 
    end 
    end 

    def update 
    if @magazine.update(magazine_params) 
     if params[:images] 
     params[:images].each { |image| 
      @magazine.pages.create(image: image) 
     } 
     end 
     redirect_to @magazine, notice: 'Magazine was successfully updated.' 
    else 
     render :edit 
    end 
    end 

    def destroy 
    @magazine.destroy 
    redirect_to magazines_url, notice: 'Magazine was successfully destroyed.' 
    end 

    private 

    def set_magazine 
    @magazine = Magazine.friendly.find(params[:id]) 
    end 

    def magazine_params 
    params.require(:magazine).permit(:titre, :apercu) 
    end 

end 

и здесь page_controller.rb

class PagesController < ApplicationController 
    before_action :authenticate_user!, only: [:edit, :update, :destroy] 
    before_action :set_page, only: [:show, :edit, :update, :destroy] 

    def index 
    @pages = Page.all 
    end 

    def show 
    end 

    def new 
    @page = Page.new 
    end 

    def edit 
    end 

    def create 
    @page = Page.new(page_params) 

    if @page.save 
     redirect_to @page, notice: 'Page was successfully created.' 
    else 
     render :new 
    end 
    end 

    def update 
    if @page.update(page_params) 
     redirect_to @page, notice: 'Page was successfully updated.' 
    else 
     render :edit 
    end 
    end 

    def destroy 
    @page.destroy 
    redirect_to :back, notice: 'Page was successfully destroyed.' 
    end 

    private 

    def set_page 
    @page = Page.find(params[:id]) 
    end 

    def page_params 
    params.require(:page).permit(:titre, :apercu) 
    end 

end 

Edit 2

Вот выход из development.log при попытке попасть на страницу

Started GET "/magazines/magazine-54/pages/11" for 127.0.0.1 at 2016-12-12 11:04:45 +0100 
Processing by PagesController#show as HTML 
    Parameters: {"magazine_id"=>"magazine-54", "id"=>"11"} 
Completed 500 Internal Server Error in 2ms (ActiveRecord: 0.0ms) 



NoMethodError (undefined method `pages' for nil:NilClass): 

app/controllers/pages_controller.rb:49:in `set_page' 
    Rendering /var/lib/gems/2.3.0/gems/actionpack-5.0.0.1/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb within rescues/layout 
    Rendering /var/lib/gems/2.3.0/gems/actionpack-5.0.0.1/lib/action_dispatch/middleware/templates/rescues/_source.html.erb 
    Rendered /var/lib/gems/2.3.0/gems/actionpack-5.0.0.1/lib/action_dispatch/middleware/templates/rescues/_source.html.erb (2.4ms) 
    Rendering /var/lib/gems/2.3.0/gems/actionpack-5.0.0.1/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb 
    Rendered /var/lib/gems/2.3.0/gems/actionpack-5.0.0.1/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb (1.2ms) 
    Rendering /var/lib/gems/2.3.0/gems/actionpack-5.0.0.1/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb 
    Rendered /var/lib/gems/2.3.0/gems/actionpack-5.0.0.1/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb (0.7ms) 
    Rendered /var/lib/gems/2.3.0/gems/actionpack-5.0.0.1/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb within rescues/layout (13.8ms) 
+0

Вы можете использовать параметр ': id' и номер страницы пропуска вместо id. Затем вместо 'Page.find (params [: id]) вы можете вызвать что-то вроде' magazine.pages.find_by (page_number: params [: id]) ' –

+0

Спасибо за ваш ответ, я попробовал, но я получил следующая ошибка: 'NameError (неопределенная локальная переменная или метод 'журнал' для PageController, вы имели в виду? journal_url)'. Поэтому я попробовал с 'magazine_url' вместо' magazine', но теперь он не распознает 'страницы'.Однако я все еще вижу, что он пытается получить идентификатор в качестве параметра вместо page_number. – Jaeger

+0

«журнал» - это просто псевдокод, я не знаю вашего кода контроллера, чтобы опубликовать рабочий код. Замените 'журнал' переменной, что вы храните объект' Magazine' в –

ответ

1

С этими ro Утес

resources :magazines do 
    resources :pages 
end 

вы должны быть в состоянии обновить PagesController и добавить/обновить следующие методы:

def magazine 
    @magazine = Magazine.find(params[:magazine_id]) 
end 

def page 
    @page = @magazine.pages.find_by(page_number: params[:id]) 
end 

, чтобы заставить его работать, вы должны иметь page_number столбец в Page модель и has_many :pages объединение в Magazine модели

+0

У меня на самом деле уже есть нужный материал в моих моделях/столбцах, однако я попробовал свой код и получил 'undefined method 'pages' для nil: NilClass'. Кажется, что даже мысль, которую я определил @magazine только выше, она все еще не знает, что это значит сразу после этого ... – Jaeger

+0

Можете ли вы вставлять выходные данные из консоли при выполнении запроса к контроллеру? –

+0

Извините, я не думаю, что понимаю, что вы хотите, чтобы я сделал, вам нужен полный след запроса? – Jaeger

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

  • Нет связанных вопросов^_^