2012-04-07 2 views
0

Я работаю над Rails Bates Railscast # 124: Бета-приглашения. У меня есть весь код на месте, но я не смог заставить все работать. Когда я пытаюсь отправить приглашение электронной почты, я получаю это сообщение.Ошибка маршрутизации Rails: приложение не может выполнить POST

Routing Error  
    No route matches [POST] "/invitations" 

Если я плюрализую имя ресурса в Routes.rb, я получаю другую ошибку маршрутизации.

Routing Error 
    uninitialized constant InvitationsController 

Что я делаю неправильно?

Это мой файл Routes.rb.

resources :users, :invitation 
    resources :sessions, :only => [:new, :create, :destroy] 

    match '/hunts', :to => 'hunts#index' 

    match '/signup/', :to => 'users#new' 
    match '/signin', :to => 'sessions#new' 
    match '/signout', :to => 'sessions#destroy' 
    match '/contact', :to => 'pages#contact' 
    match '/about', :to => 'pages#about' 
    match '/help', :to => 'pages#help' 

    root :to => "pages#home" 
    match ':controller(/:action(/:id(.:format)))' 
end 

И мой контроллер приглашения.

class InvitationController < ApplicationController 

    def new 
    @invitation = Invitation.new 
    end 

    def create 
    @invitation = Invitation.new(params[:invitation]) 
    @invitation.sender = current_user 
    if @invitation.save 
     if logged_in? 
     Mailer.deliver_invitation(@invitation, signup_url(@invitation.token)) 
     flash[:notice] = "Thank you, invitation sent." 
     redirect_to root_path 
     else 
     flash[:notice] = "Thank you, we will notify when we are ready." 
     redirect_to root_path 
     end 
    else 
     render :action => 'new' 
    end 
    end 

end 

Обновление: здесь запрашивается информация. Views/приглашение/html.erb

<%= form_for @invitation do |f| %> 
     <p> 
     <%= f.label :recipient_email, "Friend's email address" %><br /> 
     <%= f.text_field :recipient_email %> 
     </p> 
     <p><%= f.submit "Invite!" %></p> 
    <% end %> 
+0

Пожалуйста, обновите свой вопрос с кодом вида –

ответ

2

rake routes является очень полезным инструментом, который вы можете использовать, чтобы увидеть все маршруты, определенные для вашего приложения.

Вы добавили resources :invitation, который определяет следующие маршруты

invitation_index GET /invitation(.:format)   invitation#index 
       POST /invitation(.:format)   invitation#create 
    new_invitation GET /invitation/new(.:format)  invitation#new 
edit_invitation GET /invitation/:id/edit(.:format) invitation#edit 
     invitation GET /invitation/:id(.:format)  invitation#show 
       PUT /invitation/:id(.:format)  invitation#update 
       DELETE /invitation/:id(.:format)  invitation#destroy 

Обратите внимание, что вы вызываете действия InvitationController «s.

Так что с вашим маршрутом ничего не происходит -> сопоставление контроллера.

Вы просто отправляете сообщение на несуществующий маршрут. Когда вы дублируете имя маршрута, вы получаете несуществующий контроллер (InvitationsController).

Просто измените URL-адрес, на который вы отправляете сообщения, и вам хорошо идти.

+0

Итак, что самое интересное в RESTful? Плюрализировать контроллер приглашения или изменить URL-адрес, который я отправляю? –

+2

Я бы выбрал множественное имя контроллера. Это определенно больше RESTful. Обычная картина в сообществе рельсов - если вы сомневаетесь, следуйте этому соглашению, поскольку одна из мантры рельсов - «Конвентная конфигурация». У ваших уникальных маршрутов больше шансов взорваться. Проверьте [this] (http://stackoverflow.com/questions/646951/singular-or-plural-controller-and-helper-names-in-rails). – shime

+0

Красивые. Спасибо за ссылку! –

0

Попробуйте использовать множественное число, когда вы звоните resources в вашем config/routes.rb:

resources :users, :invitations 

Это происходит потому, что вы передаете экземпляр Invitation модели (@invitation) к помощнику, он множественное число имени класса, чтобы знать, где подать.
Кроме того, поскольку @invitation еще не сохранен в БД (@invitation.new_record? возвращает true), то form_for установить метод формы в «POST».

Эта информация означает, что запрос POST для «приглашений» обрабатывается «приглашениями # create» (метод create класса InvitationsController). Это соглашение по конфигурации, если вы хотите получить приглашения в RESTful способом и использовать resources в своих config/routes.rb вещах должны быть названы определенным образом, чтобы работать из коробки (или вы могли бы просто переопределить атрибут «действие» вашего формы, используя некоторые параметры помощников формы).

BTW, если вы хотите сделать что-то по-другому, вы должны прочитать Rails Guide to Routing и посмотреть, поможет ли вам какой-либо вариант определения правил маршрутизации приглашений, а также посмотрите на REST chapter of the Getting Started Rails Guide.

UPDATE: Я пропустил предложение «Если я плюрализую имя ресурса в Routes.rb, я получаю другую ошибку маршрутизации».

BTW, проблема заключается в том, что ваше имя класса контроллера является «InvitationController», а форма, сгенерированная помощником form_for, отправляется на «/ приглашения».

+0

Я немного смущен большим абзацем выше. Можете ли вы изменить его, чтобы сделать его более ясным? –

+0

Несомненно, только что измененный. Спросите, если вы все еще запутались;) –

+0

А, я вижу. Спасибо за разъяснения. И спасибо за ссылку. –