0

我正在尝试将单个元描述和标题设置为 Ruby on Rails 应用程序中的单个页面。这是以前的开发人员应用程序,我被赋予了编辑任务。另外,我是 Rails 和 Ruby 的新手。

该应用程序有一个controllers/pages_controller.rb地方,我可以在某些页面(任务和免责声明)上设置唯一变量@descriptionX@title但不能为其他页面设置唯一变量,例如 pet_planning。

class PagesController < ApplicationController
  def index
    @title = params[:page].humanize
    render params[:page]
  end

  def pet_planning
    @descriptionX = 'pet planning'
    @title = 'pet planning title'
    render :pet_planning
  end        

  def mission
    @title = 'Our Mission Statement'
    @descriptionX = 'Mission Description'
    render :mission
  end

  def disclaimer
    @title = 'Our Disclaimer'
    render :disclaimer
  end

end

我认为那render params[:page]是我迷路的地方。我不是 100% 确定这是做什么的,或者如何使用它。

我不明白为什么我能够控制@titleand @descriptionmission但不能控制pet_planning它们views都在同一个/views/pages/目录中。而且我似乎在应用程序的其他任何地方都找不到两者之间的任何区别。

另外,尝试= @title = 'Pet Planning'/views/pages/pet_planning.html.haml文件中添加。它确实更改了标题,但它也意外地显示在页面内容的顶部。

任何帮助将不胜感激。谢谢。

4

2 回答 2

1

我建议阅读ActionController 指南,它解释了 Rails 如何将来自用户的请求转换为要呈现的页面。

基本上,例如,当您发送请求时

GET http://www.example.com/pages/?page=pet_planning

然后 Rails 使用路由器计算出如何处理它(路由指南对此进行了更详细的解释)。我想您的应用程序已设置为使/pages路线与PagesController#index操作相匹配。您可以查看您的config/routes.rb文件和/或rake routes在终端输入以查看您的路线是如何设置的。

请求中问号后面的位是“查询字符串”,Rails 将其转换为params哈希,对于我上面的示例,看起来像{:page => "pet_planning"}. 您的index操作着眼于获取要呈现的页面的名称 - 这就是render params[:page]正在做的事情。

我猜您可以修改某些页面而不是其他页面的变量的原因是它们中的一些有自己的路由 -例如/pages/mission使用PagesController#mission操作 - 而某些页面是通过index使用page参数的操作访问的 -/pages/?page=pet_planning或者可能是/pages/index.html?page=pet_planning.

更新:您现有的路线

match 'practice_areas/:page' => 'pages#index', :as => :pages

可以分解成

match 'practice_areas/pet_planning' => 'pages#pet_planning' :as => :pet_planning
# etc ...

这将对应于一个看起来像这样的控制器

class PagesController < ApplicationController
  def pet_planning
    @title = "Pet planning!"
    @description = "Whatever..."
  end
end

您的建议很接近,但是因为路由格式是"controller_name#action_name",所以您需要多个看起来像这样的控制器

class PetPlanningController < ApplicationController
  def index
    @title = "Pet planning!"
    @description = "..."
  end
end

并且您必须将您的视图从app/views/pages/pet_planning.html.haml移至app/views/pet_planning/index.html.haml. 所以它可能不是你想要的。

请注意,如果您在每个操作中所做的不同之处在于自定义标题和描述,则可能有比将所有内容拆分为单独操作更好的方法来解决问题。例如,您可以使用将您的页面名称映射到其相应信息的哈希:

class PagesController < ApplicationController
  PAGE_INFO = {
    "pet_planning" => ["Pet planning!", "Whatever..."],
    "other_page" => ["Title", "Description"],
    # ...
  }

  def index
    page_name = params[:page]
    @title, @description = PAGE_INFO[page_name]
    render page_name 
  end
end
于 2013-01-08T17:45:45.333 回答
0

pet_planning、任务和免责声明中的渲染调用与默认行为相同,因此可以删除这些调用。他们告诉 Rails 使用具有给定文件名的页面。对于 index 方法,这是基于参数呈现页面。

标题和描述可能在布局中设置。查看 /views/layouts/application.html.haml 或 /views/layouts/pages.html.haml。

于 2013-01-08T17:02:45.750 回答