![](/img/trans.png)
[英]Ruby/Rails - Is there a workaround for this double render error ( Render + Redirect )
[英]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.