2012-01-03 24 views
29

Tôi đang gặp lỗi định tuyến (tôi nghĩ) trong khi sử dụng trình trợ giúp form_for của Rails. Tôi đã được tìm kiếm xung quanh và nhìn vào this question, nhưng số nhiều cho "static_event" với số nhiều là "static_events" vì vậy tôi đang thua lỗ. Bất kỳ trợ giúp sẽ được đánh giá cao. Dưới đây là các chi tiết ....Phương thức chưa xác định với "_path" trong khi sử dụng đường ray form_for

ActionView::Template::Error (undefined method `static_events_path' for #<#<Class:0x007f9fcc48a918>:0x007f9fcc46fa78>): 

mẫu của tôi:

class StaticEvent < ActiveRecord::Base 
attr_accessible :content, :title, :discount, :location, :day_of_week, :start_time 

điều khiển của tôi:

class StaticEventsController < ApplicationController 

    before_filter :authenticate, :only => [:create, :destroy] 
    before_filter :authorized_user, :only => [:destroy] 


    def new 
    @title = "Share An Event" 
    @static_event = StaticEvent.new 
    end 

    def create 
    @static_event = current_user.static_events.build(params[:event]) 
    if @static_event.save 
     flash[:success] = "Event Shared" 
     redirect_to @static_event #this was the old version 
    else 
     render :new 
    end 
    end 

Tuyến:

match '/static-events/new', :to => 'static_events#new' 
match '/static-events/',  :to => 'static_events#index' 
match '/static-events/:id', :to => 'static_events#show' 

Quan điểm

<%= form_for (@static_event) do |f| %> 
<%= render 'shared/error_messages', :object => f.object %> 
<%= text_field "static_event", "title", "size" => 48 %> 
<%= time_select "static_event", "start_time", {:ampm => true, :minute_step => 15} %> 
<%= text_area "static_event", "content", "cols" => 42, "rows" => 5 %> 
<%= text_field "static_event", "discount", "size" => 48 %> 
<%= text_field "static_event", "location", "size" => 48 %> 
<%= text_field "static_event", "day_of_week", "size" => 48 %> 
<input name="" type="submit" class="button" value="share on chalkboard" /> 
<% end %> 

Trả lời

24

Chỉ các tuyến đường được tạo bằng phương pháp resources mới được đặt tên tự động.

Nếu bạn muốn đặt tên tuyến đường của bạn, sử dụng :as tùy chọn:

match '/static-events/new', :to => 'static_events#new', :as => :new_static_event 
match '/static-events/',  :to => 'static_events#index', :as => :static_events 
match '/static-events/:id', :to => 'static_events#show', :as => :static_event 

Tuy nhiên, nó tốt hơn để sử dụng phương pháp resources. Bạn phải vượt qua cái tên "true" của mô hình của bạn như là tham số đầu tiên, sau đó ghi đè lên các đường dẫn nếu bạn muốn:

resources :static_events, :path => 'static-events' 
+0

Tuyệt vời, tôi đã cập nhật lỗi này. Cảm ơn Fábio! – Alekx

+0

Trong đường ray 4, bạn cũng sẽ cần phải chỉ định phương thức http với 'via' – courtsimas

+1

Như một bên không, đối với các tuyến lồng nhau, bạn sẽ phải chuyển một cặp giá trị để' form_for ([@ static_event, @ sub_event]) ' –

3

Run rake routes và bạn sẽ thấy danh sách các tuyến đường của bạn. Sau đó, bạn có thể sửa tệp tuyến đường để có đường dẫn thích hợp.

+0

Từ những gì tôi có thể thấy, các tuyến đường của tôi trông chính xác. – Alekx

+0

Mẹo gỡ lỗi tốt - điều này đã giúp tôi. – infl3x

8

Trước hết, bạn cần xác định tuyến đường của bạn theo cách này:

resources 'static-events', :only => [:new, :create] 

này sẽ tạo ra một lộ trình cho mới và tạo phương pháp.

Vì khi bạn sử dụng đối tượng ActiveRecord mới làm đối số để tạo thành, nó sẽ tìm kiếm * s_path như static_events_path trong tệp tuyến đường của bạn bằng động từ POST.

Tôi nghĩ cách bạn đã xác định tuyến đường của bạn không tạo static_events_path với động từ POST (bạn có thể kiểm tra bằng cách sử dụng các tuyến đường rake như megas đã nói). Vì vậy, không sử dụng kết hợp nữa, sử dụng tài nguyên hoặc nhận/đăng/... thay vì kết hợp trong các dự án Rails 3 của bạn.

EDIT

Tôi không để ý ngày hôm qua, nhưng không có đường cho tạo phương pháp. Thêm tuyến đường bên dưới trước static_events # index hoặc xóa tất cả tuyến đường của bạn và làm như tôi đã nói ở trên.

post '/static-events/', :to => 'static_events#create' 
+0

': static-events' không phải là một biểu tượng hợp lệ –

+0

Tôi đã sử dụng: static_events và nó hoạt động. – Alekx

+0

Bạn đang đúng injekt, biểu tượng không thể chứa dấu gạch ngang. Tôi đã sửa lỗi sai số – basgys

1

này xảy ra với tôi khi tôi đã sử dụng một tài nguyên lồng nhau, nhưng quên để thực sự khởi tạo phụ huynh tài nguyên sử dụng load_and_authorize_resource trong cancan. Do đó, tài nguyên chính là null và nó đã ném lỗi này.

Tôi đã sửa lỗi bằng cách khai báo load_and_authorize_resource trên phụ huynh trong bộ điều khiển.

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