ruby on rails - 没有路由匹配[POST]“/ login / index”

时间:2014-01-12 07:50:28

标签: ruby-on-rails

我对rails很新,我最近遇到了一个问题.. 我创建了一个看起来像这样的登录页面:

<!DOCTYPE html>
<div id="content">
    <form action="#" method="POST" id="login-form">
        <fieldset>
            <p>
                <label for="login-username">username</label>
                <input type="text" id="login-username" class="round full-width-input" autofocus />
            </p>
            <p>
                <label for="login-password">password</label>
                <input type="password" id="login-password" class="round full-width-input" />
            </p>
            <!--<a href="dashboard.html" class="button round blue image-right ic-right-arrow">LOG IN</a>
            <%= link_to "Add to your favorites list", '/login/index', { :class=>"button round blue image-right ic-right-arrow" }  %>-->
            <%= submit_tag "Login" %>
        </fieldset>
    </form>
</div> <!-- end content -->

此视图位于app / views / login / index.html.erb下 匹配控制器位于app / controllers / login_controller.erb下,看起来像这样:

class LoginController < ApplicationController
  def index
  end

  def login
  end

end

我的路由看起来像这样:

BonhamNew::Application.routes.draw do

  get "login/index"
  # The priority is based upon order of creation: first created -> highest priority.
  # See how all your routes lay out with "rake routes".

  # You can have the root of your site routed with "root"
  root 'login#index'
end

当我点击总结时,我得到: 没有路线匹配[POST]“/ login / index”

我知道它非常基本,但是也许有些人可以帮我一个忙吗?

谢谢!

3 个答案:

答案 0 :(得分:1)

您应该创建其他路线post "login/index"

答案 1 :(得分:1)

除了get路由之外,您应该将路由添加到routes.rb文件中post 'login/index'。这将确保表单不会导致错误,但保持行为不变,表单将请求发送到login#index而不是login#login

此外,请使用form_tag帮助程序,而不是显式使用HTML表单标记。在rails中更好的做法,并允许您使用浏览器可能不支持的HTTP方法,如PUT和DELETE。它还添加了Rails所需的字段,以确保您的表单不是通过跨站点请求发送的。 (真实性令牌)

另请注意text_field_taglabel_tagpassword_field_tag助手与上面的form_tag位于同一页面上。您应养成使用这些优先于原始HTML的习惯。

答案 2 :(得分:0)

阅读resourceful routing in Rails。这里的示例仅使用ActiveRecord模型来获取资源,但您也可以在没有ActiveRecord模型的情况下创建一个模型。

登录可以被视为一种资源,其中创建登录不会创建数据库记录,而是将用户登录到应用程序中。

在您的routes.rb中定义资源,如下所示:

BonhamNew::Application.routes.draw do
  resource :login, only: [:show, :create]
end

这将使您的控制器如下:

class LoginsController
  def show
    # Renders a page with the login form
  end

  def create
    # Logs the user in, your old login action
  end
end

注意默认情况下控制器的名称是复数形式LoginsController。如果您需要单数名称,只需指定要用于资源的控制器,如下所示:

resource :login, controller: 'login', only: [:show, :create]

然后你的控制器看起来像这样:

class LoginController
  # actions
end