0

我正在研究 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 %>
4

2 回答 2

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

因此,您的路线 -> 控制器映射没有任何问题。

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

只需更改您发布到的 URL,您就可以开始了。

于 2012-04-07T17:55:53.313 回答
0

resources调用时尝试使用复数config/routes.rb

resources :users, :invitations

发生这种情况是因为您将Invitation模型 ( @invitation) 的一个实例传递给此帮助器,它使类名复数以知道在哪里提交。
此外,由于@invitation尚未保存在数据库中(@invitation.new_record?返回true),因此form_for将表单的方法设置为“POST”。

此信息意味着对“邀请”的 POST 请求由“invitations#create”(类的create方法InvitationsController)处理。这是配置上的约定,如果您想以 RESTful 方式访问邀请并resources在您的config/routes.rb事物中使用必须以某种方式命名以开箱即用(或者您可以简单地使用一些覆盖表单的“action”属性表单助手选项)。

顺便说一句,如果您想以不同的方式进行操作,您应该阅读Rails 路由指南,看看是否有一些选项可以帮助您定义邀请路由规则,并查看Rails 入门指南的 REST 章节

更新:我错过了“如果我在 Routes.rb 中将资源名称复数,我会收到不同的路由错误”这句话。

顺便说一句,问题是您的控制器类名称是“InvitationController”,而form_for助手生成的表单提交给“/invitations”。

于 2012-04-07T19:21:18.067 回答