我正在Rails中写一个博客应用程序,注册用户并允许创建文章。任何人都可以查看这些文章(没有用户帐户)。文章/ show.html.erb相当复杂,显示其他信息,如相关文章等... 下面是代码的简化版本。
模型
class User < ActiveRecord::Base
has_many :articles
end
class Article < ActiveRecord::Base
belongs_to :user
end
控制器
class ArticlesController < ApplicationController
def show
@article = Articles.find(params[:id])
end
end
用户登录后,用户应该能够查看与没有用户帐户的任何人类似的文章。因此,当用户点击文章时,会显示文章/ show.html.erb。我想为登录用户提供一个单独的链接,以便在单独的视图中查看他的文章,而无需前面提到的其他复杂细节。
我怎么能这样做,因为控制器动作ArticleController#show已经映射到article / show.html.erb。
似乎可以通过使用其他控制器(如UserArticleController和userarticlecontroller / show.html.erb)来实现。但我想知道这可能不是Rails做事的方式,并且可能存在一种更好的方法来处理这种情况。
答案 0 :(得分:1)
同一个控制器中的不同操作,或新控制器中的新操作,或现有操作中的某些条件逻辑:
def show
@article = Artile.find(params[:id])
render 'show_for_user' if @article.user == current_user
end
基本上,如果文章归当前用户所有(或者您需要的任何其他类型的逻辑),它将呈现特定视图;否则流量会从函数末尾掉落(如果没有其他内容通过render
或redirect_to
输出),则会呈现默认的show
视图。
答案 1 :(得分:1)
对于较小的应用程序,您可以接受您接受的答案,但对于稍微复杂的项目,我实际上更喜欢90%的时间使用单独的控制器,
保持客人和会员代码分开有很大帮助,当两者之间的要求总是开始漂移和安全和ddos漏洞等其他考虑因素开始出现时(在大型网站上你将使用缓存在公共场合A)比如成员路线更多,为所有访客路由和所有成员控制器使用单独的超类(它们是ApplicationController的子代)也是一个好主意,您可以单独设置安全性,事件记录等,并且在一个地方以这种方式没有kludges。