1

例如,我将部分内容<%= render "layouts/location" %>放在整个站点的视图中。我需要一个布局控制器(我试过 layouts_controller.rb )所以我可以做

def _location
    @city = request.location.city
    @state = request.location.state
  end

部分包含代码<%= @city %>, <%= @state %>

这一切都有效,应该在呈现部分的任何页面上显示访问者的城市和状态。

但是,当我这样做并推送到 heroku 并迁移数据库时,我收到错误消息:应用程序中发生错误,无法提供您的页面。请稍后重试。

如果您是应用程序所有者,请查看您的日志以获取详细信息。

所以问题是,如何为部分定义函数?

4

3 回答 3

3

您可以在应用程序控制器的前置过滤器中执行此操作,如下所示:

...
before_filter :location

def location
    @city = request.location.city
    @state = request.location.state
end

方法的名称需要与before_filter调用中的符号匹配,但除此之外,您可以随意调用该方法。该方法必须在 ApplicationController 类中。

澄清:这将在您的应用程序中的每个请求之前被调用并为您设置这两个实例变量,因此在每个视图中,您将始终自动访问@city 和@state。

于 2012-04-11T20:11:23.193 回答
2

我觉得您可以从其他解决方案中进行一些改进。

在应用程序控制器中

class ApplicationController < ActionController::Base
    before_filter :set_location, only: [:index, :show, :edit]

    def set_location
      @city = request.location.city
      @state = request.location.state
    end
end

创建、更新和销毁操作可能不需要这些变量,因此使用only: [...]似乎是个好主意。您可以在其中添加其他自定义方法。主要问题是您的create操作何时失败,并且您需要呈现“编辑”页面。如果您不需要编辑页面上的这些变量,那么一切都很好。否则,您需要调用set_location自己:

def create
    @lala = Lala.new(...)
    @lala.save
    set_location if @lala.errors.any?
    respond_with @lala
end

此外,在不需要这些变量的 30% 页面中,您可以使用skip_before_filter

 class BlogsController < ApplicationController
    #assume you dont need those variables in your blog

    skip_before_filter :set_location # you can also use only: [:index, ...] here
 end
于 2012-04-11T20:18:46.707 回答
1

你应该看看细胞。它是一个很棒但相当未知的宝石,它允许您在“单元”中构建您的应用程序。这可能正是您所需要的。

于 2012-04-11T20:25:46.430 回答