我必须遗漏一些东西...我的视图正在渲染,但看起来控制器中的代码没有被执行。我找不到什么是错的。
当我单击login.html.erb
中的登录按钮时,应调用PublicController的login_process
方法来验证用户身份。这似乎不会发生,因为视图login_process.html.erb
只是显示,这是不可能的。
我甚至尝试在flash[:notice] = "heyhey"
操作上添加login_screen
,以便它显示在登录表单上,但这种情况也不会发生。
我做错了什么?
它是routes.rb
吗?
的routes.rb
root :to => "public#index"
get "login",
:to => "public#login",
:as => "login_screen"
post "login_process",
:to => "public#login_process",
:as => "login_process"
get "logout",
:to => "public#logout",
:as => "logout"
public_controller.rb
class PublicController < ApplicationController
def login_screen
flash[:notice] = "heyhey"
end
def login_process
authenticated_user = User.authenticate params[:email], params[:password]
if authenticated_user
session[:user_id] = authenticated_user.id
session.countdown_start(1.minute)
redirect_to :public => :index
else
flash[:notice] = 'Email/Password incorrect. <a href="#">Receive a new password</a>.'
flash[:color] = "invalid"
end
render :login_screen
end
def logout
session.countdown_abort
flash[:notice] = "You are now logged out"
redirect_to :login_screen
end
def count
render :text => session.countdown_count.to_i
end
end
视图/公共/ login.html.erb
<h1>Login</h1>
<p id="notice"><%= notice %></p>
<%= form_tag :login_process do %>
<div class="field">
<%= label_tag :email %><br>
<%= text_field_tag :email %>
</div>
<div class="field">
<%= label_tag :password %><br>
<%= password_field_tag :password %>
</div>
<div class="actions">
<%= submit_tag "Login" %>
</div>
<% end %>
<h1>Login</h1>
<p id="notice"><%= notice %></p>
<%= form_tag :login_process do %>
<div class="field">
<%= label_tag :email %><br>
<%= text_field_tag :email %>
</div>
<div class="field">
<%= label_tag :password %><br>
<%= password_field_tag :password %>
</div>
<div class="actions">
<%= submit_tag "Login" %>
</div>
<% end %>
login_process.html.erb
我从不希望看到此页面,因为用户应该被定向到其他地方
<p>login_process.html.erb</p>
<p id="notice"><%= notice %></p>
更新1:
我已将用户模型中的
authenticate
操作修改为:PublicController上的def authenticate(:email, :password) #x = new User #x.id = 123 return false #x end
和
login_process
为:def login_process if true flash[:notice] = 'boom' else flash[:notice] = 'Email/Password incorrect. <a href="#">Receive a new password</a>.' flash[:color] = "invalid" end redirect_to :login_screen end
不幸的是,虽然......同样的问题。
login_process.html.erb
是。{ 显示为否闪光通知。版本:
Ruby 2.0.0p247
Rails 4.0.0
答案 0 :(得分:2)
控制器中的代码可能正常执行。
我认为authenticate
上的User
类方法没有给出正确的结果。这就是为什么它不会通过if authenticated_user
而只是呈现login_process
视图的原因。您不必调用此渲染命令,如果您不执行任何操作,则会为您完成。
虽然login_process
方法存在问题。如果用户通过身份验证,则无法进行渲染调用和redirect_to一起调用,现在可能会发生这种情况。将render :login_screen
放在else的情况下,否则会出现AbstractController::DoubleRenderError
错误:Render and/or redirect were called multiple times in this action. [etc.]
如果用户已通过身份验证,则会出现错误信息。
编辑:在新的Rails项目上本地运行(存根User.authenticate
)它可以正常运行。 Flash通知出现和一切。
另外:render :login_screen
可能是render :login
,不是吗?在login_process?
如果什么都不起作用,你的:Ruby版本,Rails版本,将authenticated_user = false # or true
放在login_process中,看它是否表现不同。
答案 1 :(得分:1)
redirect_to :public => :index
好像你正在从login_process重定向到/ login_process?public = index,我认为这不是你的意图。
如果您想重定向到public #index,请尝试
redirect_to root_path
(但我无法在你的公共控制器中看到这个动作。)
答案 2 :(得分:0)
我认为问题是你在一个动作中调用了两个渲染器。每个操作只能渲染一个页面。
def login_process
authenticated_user = User.authenticate params[:email], params[:password]
if authenticated_user
session[:user_id] = authenticated_user.id
session.countdown_start(1.minute)
redirect_to :public => :index
else
flash[:notice] = 'Email/Password incorrect. <a href="#">Receive a new password</a>.'
flash[:color] = "invalid"
end
render :login_screen
end
用户已通过身份验证,redirect_to应该将您带到public / index,但是,在if语句之后调用render :login_screen
,因此无论如何都会执行代码的那部分并将您带回登录。