Son*_*ack 1 ruby ruby-on-rails ruby-on-rails-4
我正在关注Rails 4 In动作书,我遇到了以下错误:
No route matches [POST] "/sessions/new"
Run Code Online (Sandbox Code Playgroud)
我不知道为什么,因为我已经按照教程去了T.这让我相信教程本身是有缺陷的.无论如何,出于某种原因,它应该发布到会话#new,它应该发布到会话#create.我究竟做错了什么?
sessions_controller.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
Run Code Online (Sandbox Code Playgroud)
会议/ 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 %>
Run Code Online (Sandbox Code Playgroud)
的routes.rb
get "/signin", to: "sessions#new"
post "/signin", to: "sessions#create"
Run Code Online (Sandbox Code Playgroud)
你是对的,这本书有错误.
当你有一个标签的表格
<%= form_for :signin, method: "POST" do |f| %>
Run Code Online (Sandbox Code Playgroud)
如果rails不知道是什么:signin意思,那么它只会复制当前的url并将表单提交给该url(在本例中为'sessions/new'),使用post动词(无论你是否指定它!)
<form accept-charset="UTF-8" action="/sessions/new" method="post">
....
Run Code Online (Sandbox Code Playgroud)
显然,这不一定是你想要的,因为你没有/ sessions/new用于发布HTTP动词,我认为最简单的解决方案是指定路由
post "/signin", to: "sessions#create", as: "signin"
Run Code Online (Sandbox Code Playgroud)
并在您的form_for
<%= form_for signin_path do |f| %>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
939 次 |
| 最近记录: |