2016-12-09 1 views
0

나는 현재 방문자가 잡지를 온라인으로 읽을 수있는 웹 사이트를 만들고 있습니다. 저는 잡지 자체를위한 발판을 만들었고 다른 하나는 잡지에 속한 페이지를 만들었습니다. 이렇게하면 잡지를 만드는 동안 페이지에 대한 다중 업로드를 만들 수 있으며 모든 것이 동시에 업로드됩니다.URL의 ID가 아닌 다른 데이터 전달

때 다음과 같이 I 둥지 잡지의 자원 내부 페이지 자원 :

resources :magazines do 
    resources :pages 
end 

나는 그것을 할 수 없기 때문에 "domain.com/magazines/<slug>/pages/id"그러나

, 나는, ID가 몇 가지 문제가 있었다 얻을 (ID가 1로 돌아 가지 않으므로) 페이지를 세는 데 사용되므로, 나는 페이지를 셀 수있는 컨트롤러 내부에 함수를 만들고 각 페이지를 "page_number"값으로 저장합니다.

제 질문은 다음과 같습니다. 어떻게 id 대신 내 라우터에 : page_number를 사용하도록 요청할 수 있습니까? 나는이

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

처럼 보였다하지만 알 수없는 이유로, 레일 내 사용자 정의 경로가 단순히 내가 입력 할 때 존재에도 불구하고, 존재하지 않는 것을 알려줍니다 사용자 정의 경로를 만들려고 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 

여기 페이지

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

을에 page_number 열 관련 모델 Pagehas_many :pages가 있어야 작동하도록

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

': id' param을 사용하고 id 대신 페이지 번호를 전달할 수 있습니다. 그런 다음'Page.find (params [: id]) 대신'magazine.pages.find_by (page_number : params [: id]) '와 같은 것을 호출 할 수 있습니다. –

+0

답변 해 주셔서 감사합니다. 다음 오류 :'NameError (정의되지 않은 지역 변수 또는 PageController의 'magazine', 당신은 뜻? magazine_url)'. 그래서 나는'magazine' 대신'magazine_url'을 시도했지만, 이제는'pages'를 인식하지 못합니다.그러나 나는 여전히 그것을 page_number 대신에 매개 변수로 id를 얻으려고하는 것을 볼 수있다. – Jaeger

+0

'magazine'은 그냥 의사 코드이며, 나는 작동 코드를 게시하기 위해 컨트롤러 코드를 모른다. '잡지'객체를 저장할 변수로'잡지'를 넣으십시오. –

답변

1
에게 도달 할 때 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 

여기에 편집 2

이 development.log 파일의 출력이다

이러한 ro 백인 군대가

resources :magazines do 
    resources :pages 
end 

당신이 방법 다음/업데이트를 PagesController를 업데이트하고 추가 할 수 있어야한다 : 당신이 Magazine 모델

+0

필자는 실제로 필자의 모델/컬럼에 이미 필요한 것들을 가지고 있지만 코드를 시험해보고 nil 클래스를위한'정의되지 않은 메소드 '페이지를 가지고있다 : NilClass'. 바로 위의 @magazine을 정의했다고 생각하는 것 같습니다만, 바로 그 후에 무엇이 의미하는지 아직도 알지 못합니다 ... – Jaeger

+0

컨트롤러에 대한 요청을 수행 할 때 콘솔의 출력을 붙여 넣을 수 있습니까? –

+0

죄송합니다. 내가 원하는 것을 이해하지 못한다고 생각하십니까? 요청의 전체 추적을 원하십니까? – Jaeger