문제

나는 Ruby on Rails를 처음 접했고, 나는 블로그 튜토리얼.

이제 '시작'이라는 컨트롤러에 추가 작업을 추가하려고합니다.

def start
end

간단한 HTML 만 포함하는 뷰 페이지 "app/views/posts/start.html.erb"를 추가했습니다.

/게시 /시작하면 다음 오류가 발생합니다.

ActiveRecord::RecordNotFound in PostsController#show 
Couldn't find Post with ID=start

오류를 이해하고 쇼 액션이 실행되고 시작은 유효한 ID가 아닙니다. 시작 조치가 실행되지 않는 이유는 무엇입니까? 내가 놓친 MVC 아키텍처 또는 구성의 일부가 있습니까?

아래는 내 게시물 _controller.rb입니다

class PostsController < ApplicationController

  # GET /posts/start
  def start
  end

  # GET /posts
  # GET /posts.xml
  def index
    @posts = Post.find(:all)
    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml => @posts }
    end
  end

  # GET /posts/1
  # GET /posts/1.xml
  def show
    @post = Post.find(params[:id])
    respond_to do |format|
      format.html # show.html.erb
      format.xml  { render :xml => @post }
    end
  end

end

예, 서버를 다시 시작하고 Mongrel과 Webrick으로 시도했습니다.

도움이 되었습니까?

해결책

해당 경로를 허용하기 위해 라우팅이 설정되지 않았습니다. 기본 스캐 폴딩을 사용하고 있다고 가정하면이 라인을 넣으십시오. ~ 전에 그만큼 map.resources :posts config/lours.rb의 줄 :

map.connect "posts/:action", :controller => 'posts', :action => /[a-z]+/i

개선 :action AZ 만 제한합니다 ( /게시물 /1과 같은 것들을 잡지 않도록). 새로운 조치에서 밑줄이나 숫자가 필요하면 개선 될 수 있습니다.

다른 팁

당신이 만드는 오류는 실제로 꽤 흔한 일입니다.

기본적으로 레일은 스캐 폴드의 URL을 자동으로 매핑합니다. 따라서 게시물 스캐 폴드를 만들 때 Rails는 URL 경로를 매핑합니다. 그러한 경로 중 하나는 단일 게시물을보기위한 URL입니다 : /posts /(post_id)

따라서 URL /Posts /Start Rails에 들어가면 "이봐, ID = 시작으로 게시물을주세요. 그래서 레일은 쇼 메소드가 그러한 ID로 게시물을 찾을 수 없다고 불평합니다.

이 문제를 해결하는 한 가지 빠른 방법은 구성/경로를 확인하는 것입니다 .RB는 스캐 폴딩 경로 전에 시작 작업을위한 경로를 갖습니다.

# Route for start action
map.connect '/posts/start', :controller => 'posts', :action => 'start'
# Default mapping of routes for the scaffold
map.resources :posts

어쨌든, 그것이 도움이되기를 바랍니다.

Rails 4.x 사용 :

get '/posts/start', :controller => 'posts', :action => 'start'

Rails 3.x 사용 :

match '/posts/start', :controller => 'posts', :action => 'start'

대신에

map.connect '/posts/start', :controller => 'posts', :action => 'start'

그것은 내 문제를 해결했습니다.

레일 3.0.3을 사용하는 경우 시도해보십시오

당신의 경로에서 .rb

 resource :posts do
   collection do
     get 'start'
   end
 end

이것은 도움이 될 수 있습니다

말하고 싶습니다. 개발 환경.

도움이 될 수 있습니다 Rails 서버를 다시 시작하십시오. 이것은이 오류를받을 때 계산할 수있는 것보다 더 많은 시간을 보냈습니다.

이것은 작동합니다 :

map.resource :post, :collection => { :my_action => :get}

Routes.rb 파일에서 내 문제에 대한 해결책을 찾았습니다.

map.resource :post

컬렉션 인수를 추가하여 다음과 같은 방식으로 유지되었습니다.

map.resource :post, :collection => { :my_action => :get}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top