Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails路由错误:应用程序可以';不履行职务_Ruby On Rails_Rails Routing - Fatal编程技术网

Ruby on rails Rails路由错误:应用程序可以';不履行职务

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

我正在通过Ryan Bates的Railscast#124:测试版邀请函进行工作。我已经把所有的代码都准备好了,但我还没能真正让事情运转起来。当我尝试发送邀请电子邮件时,我收到此消息

    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的口号之一是“约定优先于配置”。你的单条路线更有可能爆炸。退房,漂亮。谢谢你的链接!我被上面的一段话弄糊涂了。你能把它编辑一下让它更清晰吗?当然,只是修改了一下。询问您是否仍然感到困惑;)