Rails控制器代码未执行

时间:2013-11-14 22:09:31

标签: ruby-on-rails rails-routing

我必须遗漏一些东西...我的视图正在渲染,但看起来控制器中的代码没有被执行。我找不到什么是错的。

当我单击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操作修改为:

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

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

3 个答案:

答案 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,因此无论如何都会执行代码的那部分并将您带回登录。