기존 컨트롤러에 액션 추가 (Ruby on Rails)
-
03-07-2019 - |
문제
나는 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}