0

我一定遗漏了一些东西......我的视图正在被渲染,但看起来控制器中的代码没有被执行。我找不到问题所在。

当我单击中的登录按钮时login.html.erblogin_process应该调用 PublicController 的方法来对用户进行身份验证。这似乎不会发生,因为视图login_process.html.erb只是显示,这是不可能的。

我什至尝试flash[:notice] = "heyhey"login_screen操作上添加一个,以便它出现在登录表单上,但这也不会发生。

我做错了什么?里面有东西routes.rb吗?

路线.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:

我已将authenticateUser 模型中的操作修改为:

def authenticate(:email, :password)
  #x = new User
  #x.id = 123
  return false #x
end

login_process在 PublicController 上为:

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

4

3 回答 3

2

控制器中的代码可能执行得很好。

我认为authenticateon 类方法User没有给你正确的结果。这就是为什么它不通过if authenticated_user而只是渲染login_process视图的原因。但是,您不必调用此渲染命令,如果您什么都不做,它就会为您完成。

不过方法有问题login_process。您不能同时调用渲染调用和 redirect_to,如果用户经过身份验证,现在它可能会发生在您的情况下。将 放在render :login_screenelse 情况下,否则您会收到AbstractController::DoubleRenderError错误消息:Render and/or redirect were called multiple times in this action. [etc.] 如果用户通过身份验证,您将收到错误消息。

编辑:User.authenticate在它工作的新 Rails 项目上本地运行(存根)。闪存通知出现和一切。另外:render :login_screen可能是render :login,不是吗?在登录进程中?

如果仍然没有任何效果,那么您的版本是什么:Ruby 版本、Rails 版本,放入authenticated_user = false # or truelogin_process 以查看其行为是否有所不同。

于 2013-11-14T22:27:29.610 回答
1
redirect_to :public => :index

您似乎正在从 login_process 重定向到 /login_process?public=index,我认为这不是您的意图。

如果您打算重定向到 public#index,请尝试

redirect_to root_path

(但我在您的公共控制器中看不到该操作。)

于 2013-11-14T22:42:12.423 回答
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 应该将您带到公共/索引,但是,您render :login_screen在 if 语句之后调用,因此无论如何它都会执行该部分代码并将您带回登录。

于 2013-11-14T22:46:40.440 回答