1

我有一个错误,希望有人可以帮助并给我一些线索来处理这个问题。我有选择地遵循敏捷开发书,当我复制他们的代码时,结果如下:

Routing Error
No route matches [POST] "/sessions/new"
Try running rake routes for more information on available routes. 

这就是我的 routes.rb 文件中的内容:

get 'admin' => 'admin#index'
controller :sessions do
 get 'login' => :new
 post 'login' => :create
 delete 'logout' => :destroy
end
resources :users

在我的 session_controller: skip_before_filter :authorize def new end

def create
 user = User.find_by_name(params[:login_name])
 if user and user.authenticate(params[:password])
  session[:user_id] = user.id
  redirect_to admin_url
 else
  redirect_to login_url, alert: "Invalid user/password combination"
 end
end

def destroy
 session[:user_id] = nil
 redirect_to users_url, notice: "Logged out"
end

在我的 session#new.html.erb 中:

  <% if flash[:alert] %>
  <p id="notice"><%= flash[:alert] %></p>
 <% end %>
 <%= form_tag do %>
  <fieldset>
    <legend>Please Log In</legend>
    <div>
      <%= label_tag :login_name, 'Login name:' %>
      <%= text_field_tag :login_name, params[:login_name] %>
    </div>
    <div>
      <%= label_tag :password, 'Password:' %>
      <%= password_field_tag :password, params[:password] %>
    </div>
    <div>
      <%= submit_tag "Login" %>
    </div>
  </fieldset>
<% end %>

我也在使用 has_secure_password 并且最近更新到 Ruby v 193 和 Rails 3.2.8。我只是仍在学习 ROR,因此非常感谢您的帮助-我一直在尝试自己弄清楚,但我无法做到。

4

2 回答 2

1

您当前发布到表单所在的同一页面。由于您的视图是控制器中的new操作sessions,因此它正在提交一个POSTsessions/new. 然后,Rails 正在寻找POST通往sessions#new. 由于不存在,因此出错。

但是,如果您查看您的路线,您会发现您有一条post 'login' => :create路线实际上会执行create您设置的处理表单提交的操作。因此,如果您将表单提交到/login路由,将很好地将所有内容发布到预期的操作。

为此,请更改:

<%= form_tag do %>

<%= form_tag('/login') do %>

另外,我强烈建议您阅读以下内容:http: //guides.rubyonrails.org/routing.html,它将让您更好地了解 Rails 路由的工作原理。

编辑: 我刚刚看到您可能正在重新提交到 /login 这应该可以工作......我认为它仍然会默认提交到当前操作但是这是正式的会话/新的所以你可以给我的建议吗?看看有没有区别?

于 2012-11-12T00:36:19.503 回答
0

运行“rake 路线”时你会得到什么?你能复制一下吗?另外,您能否复制表单浏览器呈现的 HTML 代码?

于 2012-11-12T00:58:08.420 回答