Rails同一型号的不同视图

时间:2014-01-01 18:00:55

标签: ruby-on-rails rails-activerecord erb

我正在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做事的方式,并且可能存在一种更好的方法来处理这种情况。

2 个答案:

答案 0 :(得分:1)

同一个控制器中的不同操作,或新控制器中的新操作,或现有操作中的某些条件逻辑:

def show
  @article = Artile.find(params[:id])

  render 'show_for_user' if @article.user == current_user
end

基本上,如果文章归当前用户所有(或者您需要的任何其他类型的逻辑),它将呈现特定视图;否则流量会从函数末尾掉落(如果没有其他内容通过renderredirect_to输出),则会呈现默认的show视图。

答案 1 :(得分:1)

对于较小的应用程序,您可以接受您接受的答案,但对于稍微复杂的项目,我实际上更喜欢90%的时间使用单独的控制器,

保持客人和会员代码分开有很大帮助,当两者之间的要求总是开始漂移和安全和ddos漏洞等其他考虑因素开始出现时(在大型网站上你将使用缓存在公共场合A)比如成员路线更多,

为所有访客路由和所有成员控制器使用单独的超类(它们是ApplicationController的子代)也是一个好主意,您可以单独设置安全性,事件记录等,并且在一个地方以这种方式没有kludges。