渲染视图问题

时间:2011-02-20 16:24:32

标签: ruby-on-rails model-view-controller view

他们是两个用户:

  1. 用户登录用户

  2. 访客 - 未登录访客。

  3. 用户和访客可以发帖提问。要发布问题,访客必须指定他的电子邮件。

    他们是两个视图“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
    

    当访客验证失败并呈现“new_for_guest”视图时,我在浏览器中看到网址“/ questions”,而不是“/ questions / new”。因此,用于“新”动作的所有样式表都消失了。

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

    当我说的时候

    format.html{ redirect_to new_question }
    

    将呈现“新”操作,但用户输入的所有数据都已消失。

    我需要在“questions / new”上下文中呈现“new_for_guest”视图。

    怎么做?

    更新

    我注意到了由脚手架生成的未触及代码的相同行为。

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

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

    我找到了类似的未回答的问题Rails create action is redirecting to index when it should be rendering the new action

1 个答案:

答案 0 :(得分:2)

这是正确的行为。根据RESTful路由,当一个表单为对象POST时,它将被发送到/object URI,这意味着创建了一个具有未知ID的新对象。这在Rails Guides中有所描述。因此,当验证失败并且您只是呈现新操作时,您将使用该URI而不是/object/new URI。

此外,你不应该对每个动作都特定你的风格,因为那里肯定会有不必要的代码冗余(我甚至不确定你是如何做到这一点的,当它在URI时不起作用变化)。对于一个动作有多个视图也是如此,它很少是绝对必要的,并且它看起来不是你的情况,因为当它是一个客人时你可以简单地利用一个空的@user对象。