繁体   English   中英

Rails Controller代码未执行

[英]Rails Controller code isn't executing

我必须缺少一些东西...我的视图正在渲染,但看起来好像未执行控制器中的代码。 我找不到问题所在。

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

我什至尝试将flash[:notice] = "heyhey" login_screen 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

views / public / 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 

login_process上的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没有任何闪动通知。

版本:
红宝石2.0.0p247
Rails 4.0.0

控制器中的代码可能正在执行。

我认为User上的authenticate类方法无法为您提供正确的结果。 这就是为什么它不通过if authenticated_user而是仅呈现login_process视图的原因。 不过,您不必调用此render命令,如果您什么都不做就可以为您完成。

但是login_process方法存在问题。 您无法同时调用render调用和redirect_to,如果您的用户通过了身份验证,则可能会发生这种情况。 render :login_screen放在else情况下,否则会出现AbstractController::DoubleRenderError错误消息: Render and/or redirect were called multiple times in this action. [etc.] 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版本,在login_process中放置authenticated_user = false # or true来查看其行为是否不同。

redirect_to :public => :index

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

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

redirect_to root_path

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

我认为问题在于您一次执行两个渲染。 每个动作只能呈现一页。

 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应该将您带到公共目录/索引,但是,您在if语句之后调用render :login_screen ,因此无论执行什么操作,它将执行该部分代码,并使您重新登录。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM