2008-12-30 30 views
36

Tôi mới dùng Ruby on Rails, tôi đã hoàn thành Blog Tutorial.Thêm hành động vào bộ điều khiển hiện có (Ruby on Rails)

Tôi hiện đang cố thêm hành động bổ sung vào bộ điều khiển, được gọi là 'bắt đầu'.

def start 
end 

Tôi đã thêm một trang xem "app/views/posts/start.html.erb" không chứa gì ngoài html đơn giản.

Khi tôi truy cập/bài đăng/bắt đầu tôi nhận được lỗi sau.

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

Tôi hiểu lỗi, hành động hiển thị đang được thực thi và bắt đầu không phải là ID hợp lệ. Tại sao hành động bắt đầu lại không được thực hiện, có một phần nào đó của cấu trúc hoặc cấu hình MVC mà tôi đang thiếu không?

Dưới đây là posts_controller.rb tôi

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 

Có, tôi đã khởi động lại máy chủ và thử nó với mongrel và webrick.

+0

Vui lòng gắn thẻ lại ... "trên" không được là thẻ – andHapp

Trả lời

26

Định tuyến của bạn không được thiết lập để cho phép tuyến đường đó. Giả sử bạn đang sử dụng giàn giáo mặc định, đặt dòng này trước dòng map.resources :posts trong config/routes.rb:

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

Các regex cho :action hạn chế nó để chỉ az (để tránh bắt những thứ như/posts/1). Nó có thể được cải thiện nếu bạn cần dấu gạch dưới hoặc số trong hành động mới của bạn.

45

Lỗi bạn đang tạo thực sự là một lỗi phổ biến.

Về cơ bản, Rails tự động ánh xạ URL cho giàn giáo của bạn. Vì vậy, khi bạn tạo các giàn giáo Bài đăng, Rails sẽ ánh xạ các tuyến đường URL cho nó. Một trong những tuyến đường đó là URL để xem một bài đăng duy nhất:/posts/(post_id)

Vì vậy, khi bạn nhập URL/bài đăng/bắt đầu Rails cho rằng bạn đang nói "Xin chào, hãy cho tôi bài đăng có ID Vì vậy, Rails phàn nàn rằng phương thức hiển thị không thể tìm thấy bài đăng có ID như vậy

Một cách nhanh chóng để khắc phục điều này là đảm bảo cấu hình/tuyến đường của bạn có tuyến đường cho hành động bắt đầu trước giàn giáo các tuyến đường:

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

Dù sao, hy vọng rằng sẽ giúp

+1

Cảm ơn bạn đã giải thích, tôi sẽ phải đọc thêm trên các tuyến đường. – Mark

+4

Tôi nghĩ một trong những điều giúp ích nhiều nhất khi cố gắng hiểu cách các tuyến làm việc trong RoR là hãy nhớ rằng chúng được đánh giá từ trên xuống dưới. Vì vậy, thường là cách tốt nhất để có các tuyến đường cụ thể hơn trước các tuyến đường chung (bắt tất cả). – David

+0

Tôi đã sử dụng kết hợp '/ trang/hành động',: controller => 'pages',: action => 'action' và nó hoạt động. –

0

tôi sáng lập. d giải pháp cho vấn đề của tôi, trong file routes.rb nơi

map.resource :post 

tôi đã thêm bộ sưu tập với lập luận, vì vậy nó ở lại theo cách này:

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

Trong Rails 3, điều này thêm '" collection "=> {" my_action "=>: get}' vào tham số GET. – rxgx

1

này hoạt động:

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

Trong Rails 3, tùy chọn thu thập thêm '" collection "=> {" my_action "=>: get}' vào tham số GET. – rxgx

8

Hãy thử điều này nếu bạn đang sử dụng đường ray 3.0.3

trong tuyến đường của bạn.RB

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

này có thể giúp

2

Tôi muốn nói, đôi khi Rails được dính với các tuyến đường-bộ nhớ đệm, ngay cả trong phát triển môi trường.

Có thể giúp khởi động lại máy chủ Rails của bạn. Điều này đã làm việc cho tôi nhiều lần hơn tôi có thể đếm khi nhận được lỗi này.

33

On Rails 4.x sử dụng:

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

On Rails 3.x sử dụng:

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

thay vì

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

nó giải quyết vấn đề của tôi.

Các vấn đề liên quan