В настоящее время я создаю веб-сайт, который позволит посетителю читать журнал в Интернете. Я создал эшафот для самого журнала, а другой - для страниц, которые принадлежат журналу. Таким образом, я могу создать многостраничную загрузку для страниц при создании журнала, и все будет загружено в одно и то же время.Передайте другие данные, кроме 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)
Вы можете использовать параметр ': id' и номер страницы пропуска вместо id. Затем вместо 'Page.find (params [: id]) вы можете вызвать что-то вроде' magazine.pages.find_by (page_number: params [: id]) ' –
Спасибо за ваш ответ, я попробовал, но я получил следующая ошибка: 'NameError (неопределенная локальная переменная или метод 'журнал' для PageController, вы имели в виду? journal_url)'. Поэтому я попробовал с 'magazine_url' вместо' magazine', но теперь он не распознает 'страницы'.Однако я все еще вижу, что он пытается получить идентификатор в качестве параметра вместо page_number. – Jaeger
«журнал» - это просто псевдокод, я не знаю вашего кода контроллера, чтобы опубликовать рабочий код. Замените 'журнал' переменной, что вы храните объект' Magazine' в –