Rails路由错误:app无法执行POST

时间:2012-04-07 17:49:15

标签: ruby-on-rails rails-routing

我正在研究Ryan Bates的Railscast#124:Beta邀请。我已经准备好了所有代码,但是我还没有真正开始工作。当我尝试发送邀请电子邮件时,我收到此消息。

    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

更新:这是请求的信息。 查看/邀请/ 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 %>

2 个答案:

答案 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的操作。

您的路线没有问题 - &gt;控制器映射。

您只是发布到不存在的路线。当您复用路线的名称时,您最终会有一个不存在的控制器(InvitationsController)。

只需更改您发布的网址,即可开始使用。

答案 1 :(得分:0)

resources:{/ p>中致电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必须以某种方式命名,以便开箱即用(或者您可以使用一些表单助手选项简单地覆盖表单的“action”属性。)

顺便说一句,如果你想以不同的方式做事,你应该阅读Rails Guide to Routing并查看某个选项是否可以帮助你定义邀请路由规则,并查看REST chapter of the Getting Started Rails Guide

UPDATE :我错过了句子“如果我在Routes.rb中复制了资源的名称,我会收到不同的路由错误。”

顺便说一下,问题是你的控制器类名是“InvitationController”,而form_for助手生成的表单提交给“/邀请”。