好的,这是有效的,但我觉得在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
谢谢!
答案 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入门教程。