2014-03-29 1 views
0

RoR을 배우고 있는데 현재 사이트 (PHP/WP 내장)를 정확한 기능 (또는 가능한 한 최선)으로 복제하기로 결정했습니다.RoR routes.rb - 모두 루트입니까?

저는 프로젝트 모델을 가지고 있으며 각각은 그들 만의 '쇼'페이지를 가지고 있습니다. 또한 모든 URL을 슬러그로 루트로 라우트하는 페이지 컨트롤러가 있습니다. 예 :/test-page,/about,/contact

그러나 프로젝트 슬러그를 "루트"로 지정할 수있는 방법이 있습니까? 그래서/projects/: slug 대신에/project-name1,/project-name2 etc가 될 것입니다.

저는 Ruby와 RoR에 익숙하지 않아서 분명히 뭔가 빠져있는 것 같아요. 이 작업을 수행하는 방법을 볼 수있는 유일한 방법은 현재 슬러그 매칭 시스템을 기반으로 슬러그 유형에 적합한 컨트롤러를 끌어 들이기 위해 컨트롤러를 작성하는 것입니다. 따라서 페이지 모델에서/page가 일치하면 해당 페이지가 사용됩니다. 그렇지 않으면 프로젝트.

내가 잘못한 것 같아서 어쨌든 컨트롤러를 지시 할 수 있는지 확신 할 수 없습니까?


이걸로 올랐지 만 불완전한 것 같습니까?

include Rails.application.routes.url_helpers 

class SiteController < ApplicationController 
    attr_accessor :project, :page 

    def show 
     check = -> m { m.where(:title => params[:slug]).first } 

     if (@project = check.call(Projects)).present? 
      render 'projects/show' 

     elsif (@page = check.call(Pages)).present? 
      render 'pages/show' 

     else 
      raise ActionController::RoutingError.new 'Not Found' 
     end 
    end 
end 
+0

이것은 실제로 Rails 컨트롤러처럼 보이지 않습니다. – Mohamad

+0

다른 방법으로이 작업을 수행 할 수 있습니까? –

답변

1

-로 '프로젝트'과의 '페이지'까지 라우팅에 관한 한 효과적으로 같은 일이다. 이런 식으로 하는게 왜 중요한지 말해 줄 수 있어요? imadesigner.com/portfolio/some-other-company-project과 같은 URL에 어떤 문제가 있습니까?

URL 스키마가있는 한 실제로 사이트를 일반 사이트 페이지와 혼합하려면 '해결 방법'이 있습니다. RoR을 시작했을 때도 PHP에서 왔습니다. 원래 pidsid 변수를 내 URL 구조에 사용하여 페이지 구조를 묘사하고이를 RoR에 가져 왔습니다. 그것은 실제로 잘되지 않았습니다. '정적 인'사이트 페이지에 대해서는 정적 문자열을 컨트롤러/메소드에 매핑하는 것이 무엇이 문제입니까?

즉, 대신에로의 생각

:

get '/contact', to: 'site#contact' 
get '/set-me-on-fire', to: 'site#burninate' 
get '/:id', to: 'site#projects' 

프로젝트가 일치를 강타하기 전에 명시 적으로 정적 경로 설정이 방법 : imadesigner.com/:could_be_either_a_project_or_page은 명시 적으로 경로를 작성합니다. imadesigner.com/contact에 대한 모든 요청은 site#contact으로 전송되고 imagedesigner.com/set-me-on-fire에 대한 요청은 site#burninate으로 전송되며 ANYTHING ELSE는 site # projects 방법을 실행하는 프로젝트에 대한 검색으로 간주됩니다. 이제 프로젝트 방법 내에서 요청이 페이지 또는 프로젝트를 검색하는지 여부를 결정할 필요가 없습니다. 그것은 항상 프로젝트를 찾고 있습니다.

이 모든 것이 고려되면 프로젝트 슬러그가 일반 페이지 슬러그를 방해하지 않도록해야하기 때문에 문제가 발생할 것입니다. 그렇지 않으면 한 모델이 다른 모델보다 우선하며 액세스 할 수없는 페이지/프로젝트가 생깁니다.

+0

이 작업은 단지 내가 기대했던 것보다 조금 더 혼란스러운 페이지를 추가하는 것입니다. 그러나 나는 이것이 그것이라고 생각한다. 고맙습니다! –

+0

또한 Reddit 게시물에 주어진 답을 고려해야합니다. 컨트롤러/메소드를 목적에 따라 분리해야합니다. 따라서 모든 정적 페이지에 필요한 메소드를 저장하는 'StaticPagesController'를 만들 수 있으며, SiteController에 * everything *을 저장하는 대신 관리하기 쉬운 html 템플릿을 app/views/static_pages/whatever.html.erb에 저장할 수 있습니다. . 정적 페이지 중 하나가 텍스트 단락 (모델이 포함 된 것) 만 보여주는 것이 아니라면, 자신의 컨트롤러로 이동할 수 있습니다. – JakeTheSnake

1

project#show에 루트 URL을 설정할 수 있습니다. 마찬가지로 : 그래서 당신은 당신이 두 모델은 하나의 컨트롤러 내에서 활용하고 싶은 말을하는지

get '/:id' => 'product#view' 
+0

하지만이 설정은 'pages'를 root로 대체합니다. –

+0

예, 가능합니다. 여러 작업을 단일 경로로 매핑 할 수 없습니다. – Nerve