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

时间:2012-05-29 23:47:27

标签: ruby-on-rails ruby-on-rails-3 web-applications

我正在编写一个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 个答案:

答案 0 :(得分: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

我希望它有所帮助...

答案 1 :(得分:2)

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

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

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

因此,不要使用respond_to块,只需在每个其他方法中调用show

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

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

它描述了render [some_view]的作用,特别是如何关闭动作名称以确定要呈现的视图。