我正在编写一个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 回答
您需要声明在路径文件中创建的这些新操作,因为它们不属于RESTful路由 .
我觉得只保留控制器中的show动作并使用render方法在show视图中创建IF以包含partials(_showMine.html.erb,showAnother.html.erb,showUnauthorized)
例:
显示视图:
我希望它有所帮助......
我基本上同意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
的作用,特别是它如何键入动作名称以确定要呈现的视图 .