Ruby on rails Rails路由错误:应用程序可以';不履行职务
我正在通过Ryan Bates的Railscast#124:测试版邀请函进行工作。我已经把所有的代码都准备好了,但我还没能真正让事情运转起来。当我尝试发送邀请电子邮件时,我收到此消息Ruby on rails Rails路由错误:应用程序可以';不履行职务,ruby-on-rails,rails-routing,Ruby On Rails,Rails Routing,我正在通过Ryan Bates的Railscast#124:测试版邀请函进行工作。我已经把所有的代码都准备好了,但我还没能真正让事情运转起来。当我尝试发送邀请电子邮件时,我收到此消息 Routing Error No route matches [POST] "/invitations" 如果在Routes.rb中对资源名称进行复数,则会出现不同的路由错误 Routing Error uninitialized constant Invitatio
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 %>
rake routes
是一个非常有用的工具,您可以使用它查看为应用程序定义的所有路由
您已经添加了资源:邀请
,它定义了以下路线
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的操作
因此,路线->控制器映射没有问题
你只是发布到一个不存在的路线。当您将路由的名称复数时,您将得到一个不存在的控制器(invitationcontroller
)
只要更改发布到的URL,就可以了。在
config/routes.rb中调用resources
时,尝试使用复数:
resources :users, :invitations
之所以会发生这种情况,是因为您将邀请
模型(@Invitation
)的一个实例传递给此帮助程序,它会将类名复数化,以知道提交到何处。
此外,由于数据库中尚未保存@invitation
(@invitation.new\u record?
返回true
),因此的form\u将表单的方法设置为“POST”
此信息表示对“邀请”的POST请求由“邀请#创建”(invitations controller
类的create
方法)处理。如果您想以RESTful方式访问邀请并在config/routes.rb中使用resources
,则这是惯例而非配置,必须以某种方式命名事物才能开箱即用(或者您可以使用一些表单帮助程序选项简单地覆盖表单的“action”属性)
顺便说一句,如果您想以不同的方式制作,您应该阅读,看看是否有一些选项可以帮助您定义邀请路由规则,并查看
更新:我漏掉了一句话“如果我在Routes.rb中对资源名称进行复数,我会得到一个不同的路由错误。”
顺便说一句,问题是您的控制器类名是“InvitationController”,而由表单\u为
助手生成的表单提交到“/invitations”。请用视图代码更新您的问题。那么,在这里最安全的做法是什么?将邀请控制器复数或更改我发布到的URL?我会选择控制器的复数名称。它肯定更安静。rails社区中的常见模式是——如果您有疑问,请遵循约定——因为rails的口号之一是“约定优先于配置”。你的单条路线更有可能爆炸。退房,漂亮。谢谢你的链接!我被上面的一段话弄糊涂了。你能把它编辑一下让它更清晰吗?当然,只是修改了一下。询问您是否仍然感到困惑;)