【问题标题】:Rails routing error: app can't perform POSTRails 路由错误:应用程序无法执行 POST
【发布时间】:2012-04-07 17:49:14
【问题描述】:

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

【问题讨论】:

  • 请用查看代码更新您的问题

标签: ruby-on-rails rails-routing


【解决方案1】:

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,您就可以开始了。

【讨论】:

  • 那么这里最 RESTful 的事情是什么?复数邀请控制器或更改我发布到的 URL?
  • 我会选择控制器的复数名称。它肯定更加 RESTful。 Rails 社区的常见模式是 - 如果您有疑问,请遵循约定 - 因为 Rails 的口头禅之一是“约定优于配置”。你的奇异路线更有可能被炸毁。签出this
  • 美丽。感谢您的链接!
【解决方案2】:

config/routes.rb 中调用resources 时尽量使用复数形式:

resources :users, :invitations

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

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

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

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

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

【讨论】:

  • 我对上面的大段有点困惑。您可以对其进行编辑以使其更清晰吗?
  • 当然,刚刚修改。询问您是否仍然感到困惑;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-21
  • 1970-01-01
  • 2020-10-07
相关资源
最近更新 更多