簡體   English   中英

呈現和/或重定向 Ruby

[英]Render and/or redirect Ruby

我有 2 個會話客戶端和管理員的登錄頁面,所以當客戶端登錄時,我會重定向以完成表單,當管理員登錄時,我將他重定向到儀表板,問題是:

ActionController::DoubleRenderError(在此操作中多次調用渲染和/或重定向。請注意,您只能調用渲染或重定向,並且每個操作最多一次。另請注意,重定向和渲染都不會終止操作的執行,因此如果你想在重定向后退出一個動作,你需要做一些像“redirect_to(...) and return”這樣的事情。)

  def login
    @institute = Configuration.find_by_config_key("LogoName")
    available_login_authes = FedenaPlugin::AVAILABLE_MODULES.select{|m| m[:name].classify.constantize.respond_to?("login_hook")}
    selected_login_hook = available_login_authes.first if available_login_authes.count>=1
    if selected_login_hook
      authenticated_user = selected_login_hook[:name].classify.constantize.send("login_hook",self)
    else
      if request.post? and params[:user]
        @user = User.new(params[:user])
        user = User.find_by_username @user.username
        if user.present? and User.authenticate?(@user.username, @user.password)
          authenticated_user = user 
        end
      end
    end
    if authenticated_user.present?
      successful_user_login(authenticated_user) and return
    elsif authenticated_user.blank? and request.post?
      flash[:notice] = "#{t('login_error_message')}"
    end
  end

  private
  def successful_user_login(user)
    session[:user_id] = user.id
    flash[:notice] = "#{t('welcome')}, #{user.first_name} #{user.last_name}!"
    redirect_to session[:back_url] || {:controller => 'user', :action => 'dashboard'}
    if user.client
      redirect_to session[:back_url] || {:controller => 'client', :action => 'complete_registration'}
    end
  end
end

你說的對 redirect_to 不是返回方法,上面的代碼也執行了。 在你successful_user_login如果用戶是客戶端,你調用redirect_to兩次,所以你可以重構這個方法:

if user.client
  redirect_to session[:back_url] || {:controller => 'client', :action => 'complete_registration'}
else
  redirect_to session[:back_url] || {:controller => 'user', :action => 'dashboard'}
end

ActionController::DoubleRenderError是 Ruby on Rails 在 controller 操作嘗試呈現或重定向響應兩次時拋出的錯誤。 在您的代碼中,該操作嘗試根據用戶作為客戶端的狀態將用戶重定向到“ user / dashboard ”和“ client / complete_registration注冊”。 這將導致DoubleRenderError 請注意,呈現或重定向不會從該方法返回。

以下是一些使用不同方法的未經測試的代碼示例:

您可以在調用redirect_to之前計算 controller 和操作:

def successful_user_login(user)
  session[:user_id] = user.id
  flash[:notice] = "#{t('welcome')}, #{user.first_name} #{user.last_name}!"

  controller, action = if user.client
    ["client", "complete_registration"]
  else
    ["user", "dashboard"]
  end

  redirect_to session[:back_url] || {controller: controller, action: action}
end

您還可以執行 if 並在第一個redirect_to之后返回:

  def successful_user_login(user)
  session[:user_id] = user.id
  flash[:notice] = "#{t('welcome')}, #{user.first_name} #{user.last_name}!"

  if user.client
    redirect_to session[:back_url] || {:controller => 'client', :action => 'complete_registration'}
    return
  end

  redirect_to session[:back_url] || {:controller => 'user', :action => 'dashboard'}
end

或者做一個 if else:

def successful_user_login(user)
  session[:user_id] = user.id
  flash[:notice] = "#{t('welcome')}, #{user.first_name} #{user.last_name}!"

  if user.client
    redirect_to session[:back_url] || {:controller => 'client', :action => 'complete_registration'}
  else
    redirect_to session[:back_url] || {:controller => 'user', :action => 'dashboard'}
  end
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM