我正在研究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 %>
答案 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
助手生成的表单提交给“/邀请”。