在Rails App上访问控制器/视图中的特定页面

时间:2013-01-08 16:47:51

标签: ruby-on-rails ruby controller

我正在尝试将各个元描述和标题设置为Ruby on Rails应用程序中的各个页面。这是以前的开发者App,我被赋予了编辑任务。另外,我是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%确定这是在做什么,或者如何使用它。

我不明白为什么当他们的@title都在@description时,我能够控制mission的{​​{1}}和pet_planning而不是views相同的/views/pages/目录。我似乎无法在应用程序的其他任何地方找到任何区别。

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

任何帮助都会受到赞赏。感谢。

2 个答案:

答案 0 :(得分:1)

我建议阅读ActionController guide,其中解释了Rails如何将用户的请求转换为要呈现的页面。

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

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

然后Rails使用路由器解决了如何处理它(routing guide更详细地解释了这一点)。我认为您的应用已设置好,以便/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

答案 1 :(得分:0)

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

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