我正在尝试将各个元描述和标题设置为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
。它确实会更改标题,但它也会意外地显示在页面顶部。
任何帮助都会受到赞赏。感谢。
答案 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。