有更优雅的方式吗? (从静态主页访问rails控制器?)

时间:2012-02-09 03:41:06

标签: ruby-on-rails ruby-on-rails-3

好的,这是有效的,但我觉得在Rails中有更好的方法可以做到这一点...我有一个主页,如果你还没有登录,那么目前没有任何型号或控制器的任何东西。它存在于/pages/home.html.erb

在该页面上,我想从我的派对模型中抓住下一个派对,并告诉网站访问者该派对。很容易,对吧?:

/app/controllers/parties_controller.rb

def nextparty
  @party = Party.find(:first, :order => "begins_on")
end

现在,在我的主页中,我使用 this ,它运行正常:

/app/views/pages/home.html.erb

<% @PartyCont = PartiesController.new() %>
<% @party = @PartyCont.nextparty() %>
<h3>The next party is <%= @party.name %></h3>

我尝试过helper方法,partials,ApplicationHelper,但这是实际工作的唯一代码。我尝试过的大多数其他事情似乎都失败了,因为@Party类没有实例化(通常错误表明该类具有临时名称和“未定义方法”)。

嘿,我很高兴它有效,但我觉得在Rails中有更好的方法。我看过一些帖子使用上面例子中的代码,然后说“但你真的不应该曾经需要这样做!”。

这样很好,还是有更像Rails的方式?

更新 我认为这个问题不仅仅是优雅......我只是意识到所有进入主页的RSPEC测试都失败了:

Failure/Error: get 'home'
 ActionView::Template::Error:
  undefined method `begins_on' for nil:NilClass

谢谢!

2 个答案:

答案 0 :(得分:2)

您希望每个视图后面都有一个控制器,并且您不希望跨越控制器边界的视图以呈现信息。考虑拥有一个欢迎控制器(或任何你喜欢称之为的控制器)。它可以有索引操作:

def index
  @party = Party.find(:first, :order => "begins_on")
end

在config / routes.rb中,将其设为根控制器操作:

root :to => "welcome#index"

另外,要干掉那么将.nextparty类方法添加到Party模型并从两个控制器操作而不是find方法调用它。

答案 1 :(得分:0)

您的视图应仅显示控制器已提供的数据。您希望显示派对资源,因此请求应转到各方控制器。如果我正确理解你的用例,那么就更具体地说就是缔约方控制器上的索引方法。

你应该有以下代码:

def index
  @party = Party.find(:first, :order => "begins_on")
end

该实例方法将在相应的视图 app / views / parties / index.html.erb

中提供
<h3>The next party is <%= @party.name %></h3>

要将其作为主页提供,您还必须调整路线: 的配置/ routes.rb中

root :to => "parties#index"

您的视图应包含尽可能少的逻辑,主要关注事物的外观。 您的控制器应该为视图准备好数据,并确保在模型上调用正确的方法。 所有繁重的业务逻辑都应该在您的模型中。

我认为你应该通过一个基本的Rails入门教程。