Ruby on rails 渲染视图问题

Ruby on rails 渲染视图问题,ruby-on-rails,model-view-controller,view,Ruby On Rails,Model View Controller,View,他们是两个用户: 用户-登录用户 访客-未登录访客 用户和来宾可以发布问题。若要发布问题,客人必须指定他的电子邮件 它们是两个视图“new.html.erb”和“new_for_guest.html.erb”。第一个依赖于@user变量。第二个没有 当来宾创建的问题验证失败时,应呈现“new_for_guest.html.erb”,并保留所有输入的数据 代码如下: def new @question = Question.new guest = session[user_id].nil

他们是两个用户:

  • 用户-登录用户

  • 访客-未登录访客

  • 用户和来宾可以发布问题。若要发布问题,客人必须指定他的电子邮件

    它们是两个视图“new.html.erb”和“new_for_guest.html.erb”。第一个依赖于@user变量。第二个没有

    当来宾创建的问题验证失败时,应呈现“new_for_guest.html.erb”,并保留所有输入的数据

    代码如下:

    def new
      @question = Question.new
    
      guest = session[user_id].nil?
    
      respond_to do |format|
        if guest
          format.html { render "new_for_guest" }
        else
          format.html { render "new" }
        end
      end
    end
    
    def create
      @question = Question.new(params[:question])
    
      guest = session[user_id].nil?
    
      respond_to do |format|
        if @question.save
          flash[:notice] = 'Question was successfully created.'
          format.html { redirect_to(@question) }
        else
          if guest
            format.html { render :action => "new_for_guest" } # problem
          else
            format.html { render :action => "new" }
        end
      end
    end
    
    当guest验证失败并且呈现“new_for_guest”视图时,我会在浏览器中看到url“/questions”,而不是“/questions/new”。因此,用于“新建”操作的所有样式表都不存在了

    当用户验证失败并且呈现“new”视图时,我看到正确的url“/questions/new”,一切正常

    当我说

    format.html{ redirect_to new_question }
    
    “新建”操作将被呈现,但用户输入的所有数据都将消失

    我需要在“问题/新”上下文中呈现“新客户”视图

    怎么做

    更新

    我注意到了由scaffold生成的未触及代码的相同行为

    通过创建验证失败时,将再次呈现新操作,但在URL中显示“/questions”而不是“/questions/new”

    这很奇怪。这是正确的行为吗


    我发现了类似的未回答问题

    这是正确的行为。按照RESTful路由,当为对象发布表单时,它被发送到
    /object
    URI,这意味着创建了一个ID未知的新对象。因此,当验证失败且仅呈现新操作时,您位于该URI而不是
    /object/new
    URI上


    此外,您不应该让您的样式针对每个操作,因为那里肯定会有不必要的代码冗余(我甚至不知道您是如何做到这一点的,以至于当URI更改时它不起作用)。对于一个操作,有多个视图也是一样,这很少是绝对必要的,而且在您的情况下似乎不是这样,因为当它是来宾时,您可以简单地使用一个空的
    @user
    对象。

    为什么要为每个
    操作定义样式表?你不能让它们依赖于
    视图吗?因为我根据布局决定要包含哪些资产包(css和js),具体取决于执行的控制器和操作。