2014-01-23 16 views
2

我有一个关于过程的问题,如果我可以这样做一个更好的方法。我正在开发一个rails应用程序,并且当certian元素不存在时,我会遇到页面错误。例如这里是我的节目动作过度使用“.present?”在轨道控制器

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 

我应该使用.present吗?就像我一样?如果某个元素不存在,是否有更好的方法可以使页面不会失败?只是试图以一种可以导致更好的代码的方式学习rails。

+1

对于情况下,你真正需要'Y = X如果x.present?',检查出[存在](http://api.rubyonrails.org/classes/Object.html#method-i-存在)方便的方法。我会听Carl Zulauf关于尽量减少控制器实例变量的建议。如果你的模型设计得很好,很少有必要有一两个(RubyMine实际上会给你警告)。 – Jimeux

回答

5

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

上述对于IssueAuthor也是如此。

回答你的问题:不,你不应该像你一样使用.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 

没有理由@prev_article = @article.prev_article if @article.prev_article.present?。如果你的观点取决于@prev_article,他们将会看到一个无值或无if @article.prev_article.present?。无论如何,你的观点必须要做.present?或类似的事情。

我可能实际上所有,但@article这里做掉,并有我的看法问文章的authornext_article

1

我是这么认为的,你只需要做到:

@next_article = @article.next_article 
@prev_article = @article.prev_article 

如果next_article不存在,那么这将是零所以用目前的状况并没有现状@next_article和@prev_article的价值将为零

1

欢迎回报率

if @article.prev_article.present? 

相同

if @article.prev_article 

and

@article_author = Author.find_by_id(@article.author_id) 

看起来你错过了belongs_to关系。如果你的模型定义如下:

class Author < ActiveRecord::Base 
    has_many :articles 
end 
class Article < ActiveRecord::Base 
belongs_to :author 
end 

然后,你可以简单地调用

@article.author 

以检索author对象。请为章节和问题做同样的事情。

当你想用ID来查询数据库,ActiveRecord的可以让你做到这一点:

@user = User.find(1) 

它看起来像你想分页的文章。给Kaminari宝石(https://github.com/amatsuda/kaminari)和Will_Paginate宝石(https://github.com/mislav/will_paginate)一个去,他们很好地建立和维护。

@issue_slug = Issue.find_by_id(@article.issue_id).slug if @article.issue_id.present? 

为了在调用方法时不错误,try方法是apt。

@article.section.try(:slug) 
+0

是的,我想使用will_paginate,但我试图做一些复杂的,有一个只有去问题内的文章的下一个和上一个按钮。我会看看它是否可以让事情变得更简单。感谢您的评论! –