过度使用".present?" 在rails控制器中

Gre*_*ton 2 validation ruby-on-rails

如果我能以更好的方式做到这一点,我对流程有疑问.我正在使用rails应用程序,并且当certian元素不存在时,我会遇到页面错误.例如,这是我的节目动作

def show 
    @article = Article.friendly.find(params[:article_slug])
    @section_slug = Section.find_by_id(@article.section_id).slug if @article.section_id.present?
    @issue_slug = Issue.find_by_id(@article.issue_id).slug if @article.issue_id.present?
    @next_article = @article.next_article if @article.next_article.present?
    @prev_article = @article.prev_article if @article.prev_article.present?
    @article_author = Author.find_by_id(@article.author_id)

    render :layout => 'magazine'
    session[:return_to] = request.referer
    #if request.path != article_path(@article)
     #return redirect_to @article, :status => :moved_permanently
    #end
  end
Run Code Online (Sandbox Code Playgroud)

我应该使用.present吗?和我一样多吗?有什么更好的东西,如果一个元素不存在,页面不会完全失败?只是尝试以一种能够带来更好代码的方式学习rails.

Car*_*auf 5

首先,你为什么不使用关系?如果Article已经有,section_id那么你应该去Section使用@article.section.belongs_to :section应该在你的Article模型中.

以上是真实的Issue,并Author为好.

回答你的问题:不,你不应该.present?像你一样使用.

这是我如何编写此操作的代码:

def show 
  @article = Article.friendly.find(params[:article_slug])
  @section_slug = @article.section.try(:slug)
  @issue_slug   = @article.issue.try(:slug)
  @next_article = @article.next_article
  @prev_article = @article.prev_article
  @author       = @article.author

  render :layout => 'magazine'
  session[:return_to] = request.referer
end
Run Code Online (Sandbox Code Playgroud)

没有理由@prev_article = @article.prev_article if @article.prev_article.present?.如果你的观点取决于@prev_article他们将看到有或没有的零值if @article.prev_article.present?..present?无论如何,你的观点将不得不做或类似.

我可能实际上都做掉,但@article这里有我的看法问文章的author, next_article等等.