我对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”
我知道它非常基本,但是也许有些人可以帮我一个忙吗?
谢谢!
答案 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_tag
,label_tag
和password_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