【问题标题】:Rails: double render error in actionsRails:动作中的双重渲染错误
【发布时间】:2015-10-30 19:33:39
【问题描述】:

我是 Rails 世界的新手,但是这个双重渲染错误有点有趣。我从未在 PHP 或 ASP.NET 中遇到过这个问题。

所以我在一个控制器中有两个动作,通过 Devise 的 Register 控制器扩展。 我想实现如果用户登录了两个new_with_schoolcreate_with_school 动作将被redirect_signed_in_user 函数重定向。

class RegistrationsController < Devise::RegistrationsController

  def new_with_school
    redirect_signed_in_user

    build_resource({})
    resource.build_school
    respond_with self.resource
  end

  def create_with_school
    redirect_signed_in_user

    build_resource(sign_up_params_with_school)    
    resource.school = School.new(sign_up_params_with_school[:school_attributes])
    resource.school.user = resource
    resource.role = 1
    resource.save

    respond_to do |format|
      if resource.save
        format.html { redirect_to after_sign_up_path_for(resource) }
        format.json { render :show, status: :created, location: resource }
      else
        clean_up_passwords resource
        set_minimum_password_length
        format.html { render :new_with_school }
        format.json { render json: resource.errors, status: :unprocessable_entity }
      end
    end
  end

  protected

    def redirect_signed_in_user
      redirect_to '/' if user_signed_in?
    end
end

我给出了这个错误信息:

在此操作中多次调用渲染和/或重定向。 请注意,您只能调用渲染或重定向,最多 每个动作一次。另请注意,重定向和渲染都不会终止 动作的执行,所以如果你想在之后退出一个动作 重定向,您需要执行类似“redirect_to(...) 和 返回”。

所以在 Rails 中我似乎只能使用一个重定向功能。

但是在这种情况下,如果用户登录,我该如何实现,登录用户无法访问这两个操作。最漂亮的解决方案是,webapp 可以以某种方式将用户重定向到根路径(不抛出异常),所以我想要最用户友好的解决方案。

我该怎么做? (我已经阅读了设计代码,但我无法弄清楚根重定向是如何工作的)

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 redirect devise


    【解决方案1】:

    使用这个:

    def redirect_signed_in_user
          redirect_to '/' && return if user_signed_in?
    end
    

    【讨论】:

    • 是的,这不会引发任何错误,但我该如何强制返回?也许我做错了什么,但是重定向不起作用,看来rails没有执行redirect_to方法。是的,if user_signed_in? 是真的,但我不明白为什么读取动作中下一行的导轨在重定向后不会退出动作。
    • 只需将此代码移动到您的主要操作中 redirect_to '/' && 如果 user_signed_in 则返回? . :)
    • “主要行动”是什么意思? :) 我想到了应用程序控制器,但什么也没有,我的操作仍然想呈现他们的视图。
    • 我的错误 create_with_school 操作
    • 是的,我想通了。有趣的是,重定向仅适用于此代码:return redirect_to '/' if user_signed_in? 谢谢 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多