我正在编写一个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)。我怎样才能做到这一点?或者我完全以错误的方式解决这个问题?
答案 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]
的作用,特别是如何关闭动作名称以确定要呈现的视图。