我的应用允许用户从两个不同的位置登录,即标题和新会话页面。新会话页面将用户登录并将其重定向到正确的页面,但主页只是重新加载主页而不重定向用户或将其登录。
这是我的sessionscontroller.rb
class SessionsController < ApplicationController
def new
end
def create
user = User.find_by(email: params[:session][:email].downcase)
if user && user.authenticate(params[:session][:password])
session[:user_id] = user.id
redirect_back_or feed_user_path(user)
else
session[:user_id] = nil
flash.now[:error] = 'Invalid email/password combination'
render 'new'
end
end
def destroy
session[:user_id] = nil
redirect_to root_url
end
end
new.html.erb
<%= form_for(:session, url: sessions_path) do |f| %>
<%= f.label :email %>
<%= f.text_field :email %>
<%= f.label :password %>
<%= f.password_field :password %>
<%= f.submit "Log in", class: "btn btn-large btn-info" %>
<% end %>
我的_header.html.erb中的代码
<%= form_for :session, :url => {:controller => "sessions", :action => "new"} do |f| %>
<div class="home-login form-group">
<%= f.label :email %>
<%= f.text_field :email, :placeholder => "Email" %>
</div>
<div class="home-login form-group">
<%= f.label :password %>
<%= f.password_field :password, :placeholder => "Password" %>
</div>
<div class="form-group home-login">
<%= f.submit "Log in", class: "btn-info" %>
</div>
<% end %>
这是终端中显示的内容
---!ruby / hash:ActionController :: Parameters utf8:✓ authenticity_token:AegIbI8c1TIddIBPVWTt / B2CBoCAgbJxL + NWDe782Cc = session:!ruby / hash:ActiveSupport :: HashWithIndifferentAccess 电子邮件: ** @ ** 密码:**** 提交:登录 控制器:页面 行动:回家
EDIT ****
这是我的应用程序控制器
class ApplicationController < ActionController::Base
# Prevent CSRF attacks by raising an exception.
# For APIs, you may want to use :null_session instead.
protect_from_forgery with: :exception
include SessionsHelper
end
Home是我的页面控制器中的静态页面
class PagesController < ApplicationController
def home
end
end
EDIT ****
这是我的SessionsHelper
module SessionsHelper
def signed_in?
!!session[:user_id]
end
def current_user
@current_user ||= User.find(session[:user_id]) if session[:user_id]
end
def current_user=(user) # set current user
@current_user = user # session[:user_id] = user.id
end
def current_user?(user) # get current user
user == current_user
end
def signed_in_user
unless signed_in?
store_location
redirect_to signin_url, notice: "Please sign in."
end
end
def redirect_back_or(default)
redirect_to(session[:return_to] || default)
session.delete(:return_to)
end
end
EDIT ****
路线
sessions POST /sessions(.:format) sessions#create
new_session GET /sessions/new(.:format) sessions#new
session DELETE /sessions/:id(.:format) sessions#destroy
答案 0 :(得分:0)
尝试更改form_for标记,使用post方法将其指向create动作。像这样的东西:
<%= form_for :session, url: session_path, method: 'post', action: 'create' do |f| %>
答案 1 :(得分:0)
除非您在那里引用任何特定于控制器的数据,否则您在何处放置登录表单没有区别。我没有看到,所以你应该好好复制完全相同的form_for
调用,实际产生工作结果。至少我没有看到任何阻止这样做的事情。
问题在于行动。 new
。错误。它是create
。 “New”是表单的显示页面(并因此使用GET),实际表单的操作(数据发送路径)是“create”(使用POST)。从路由中挑选HTTP方法,执行rake routes
以验证它们是否正确。
表单未绑定到它所在的页面。相反,它有自己的路径,应接受表单中的输入数据。
答案 2 :(得分:0)
我明白了。 ERB表单包装在HTML表单中。这导致了这个问题。