我正在阅读《Rails 4 In action》一书,但遇到了以下错误:
No route matches [POST] "/sessions/new"
我不知道为什么,因为我已经按照教程进行了操作。这让我相信教程本身是有缺陷的。无论如何,由于某种原因,它在应该发布到session#create 时却发布到session#new。我究竟做错了什么?
会话控制器.rb
class SessionsController < ApplicationController
def new
end
def create
user = User.where(:name => params[:signin][:name]).first
if user && user.authenticate(params[:signin][:password])
session[:user_id] = user.id
flash[:notice] = "Signed in successfully."
redirect_to root_url
else
flash[:error] = "Sorry."
render :new
end
end
end
会话/new.html.erb
<h1>Sign in</h1>
<%= form_for :signin, method: "POST" do |f| %>
<p>
<%= f.label :name %><br />
<%= f.text_field :name %>
</p>
<p>
<%= f.label :password %><br />
<%= f.password_field :password %>
</p>
<%= f.submit "Sign in" %>
<% end %>
路线.rb
get "/signin", to: "sessions#new"
post "/signin", to: "sessions#create"
你是对的,这本书里有一个错误。
当您有标签表单时
<%= form_for :signin, method: "POST" do |f| %>
如果 Rails 不知道什么:signin
意味着,那么它将简单地复制当前 url 并使用 post 动词(无论您是否指定!)将表单提交到该 url(在本例中为“sessions/new”)
<form accept-charset="UTF-8" action="/sessions/new" method="post">
....
显然,这不一定是您想要的,因为您没有 /sessions/new 用于 post HTTP 动词,我认为最简单的解决方案是指定一个路由
post "/signin", to: "sessions#create", as: "signin"
并在您的 form_for 中
<%= form_for signin_path do |f| %>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)