首页 文章

调用在Rails控制器中有条件地呈现视图的方法

提问于
浏览
3

我正在编写一个Ruby on Rails应用程序,其中一个名为“pages_controller”的控制器负责向用户显示页面 . 可以显示3种不同类型的页面,在每种情况下后端都会发生不同的事情,因此我决定将功能分解为控制器中的3种方法 . 当用户请求页面时,调用“show”方法,该方法确定页面是否:1 . 属于用户2.属于另一个用户,并且可以被请求它的用户查看3.属于另一个用户,请求它的用户无法查看(未经授权)

然后从那里调用适当的方法来显示页面 . 代码看起来像这样:

def show
    if (something)
      showMine

    elsif (something else)
      showAnother
    else
      showUnauthorized
    end
end

def showUnauthorized

    respond_to do |format|
      format.html # showUnauthorized.html.erb
    end
end

def showMine

    respond_to do |format|
      format.html # showMine.html.erb
    end
end

def showAnother

    respond_to do |format|
      format.html # showAnother.html.erb
    end
end

我得到一个模板丢失错误,因为rails想要在调用“show”时呈现视图,但我不希望在调用“show”时呈现任何视图 . 我只想让“show”从那里调用正确的方法,并呈现该方法的相应视图(showMine,showAnother或showUnauthorized) . 我怎样才能做到这一点?或者我完全以错误的方式解决这个问题?

2 回答

  • 2

    您需要声明在路径文件中创建的这些新操作,因为它们不属于RESTful路由 .
    我觉得只保留控制器中的show动作并使用render方法在show视图中创建IF以包含partials(_showMine.html.erb,showAnother.html.erb,showUnauthorized)

    例:

    显示视图:

    if (something)
      <%= render 'showMine' %>
    elsif (something else)
      <%= render 'showAnother' %>
    else
      <%= render 'showUnauthorized' %>
    end
    

    我希望它有所帮助......

  • 2

    我基本上同意Samy的评论,但这里有一些背景知识:

    告诉Rails使用什么视图的方法是 render . 如果在 show 方法中没有调用该方法,Rails会假设您有一个名为 show.xxx.xxx 的视图,例如 show.html.erb ,应该被渲染 . 请注意,它不假设模板将以 show 作为前缀,因为这是方法的名称 . 它假设它将是 show 因为这是动作的名称 . 操作的名称作为请求的一部分传递给控制器;它不是简单地从其中包含 respond_to 块的任何方法的名称派生的 .

    所有 respond_to 块都根据请求的MIME类型指定不同的视图模板,但由于你从不调用 render ,所有这些额外的方法仍然试图调用 show 视图(在每种情况下都是 show.html.erb ),因为你从未告诉过Rails到 render 任何其他视图,操作名称为 show .

    因此,只需在每个其他方法中调用 render [some_view] ,而不是respond_to块 .

    这可能不是最清楚的答案,但我建议您阅读以下内容:

    http://ryanbigg.com/2009/04/how-rails-works-2-mime-types-respond_to/

    它描述了 respond_to 的作用,特别是它如何键入动作名称以确定要呈现的视图 .

相关问题