【问题标题】:Static pages in Ruby on RailsRuby on Rails 中的静态页面
【发布时间】:2010-12-18 17:41:56
【问题描述】:

制作一个包含如下页面的 Ruby on Rails 应用程序的标准方法是什么

  • 首页
  • 关于
  • 联系方式

如果有人有链接或答案,我会很高兴,而不仅仅是说使用 gem,因为我想学习如何使用这种行为制作简单的 webapps。

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    取决于您希望如何处理这些页面中的内容。

    方法 #1 - 在视图中存储内容

    如果您只想将所有内容放在 ERB 视图中,那么一个非常简单的方法是创建一个PagesController,其目的是处理静态页面。每个页面由控制器中的一个操作表示。

    pages_controller.rb:

    class PagesController < ApplicationController
      def home
      end
    
      def about
      end
    
      def contact
      end
    end
    

    routes.rb:

    match '/home' => 'pages#home'
    match '/about' => 'pages#about'
    match '/contact' => 'pages#contact'
    

    然后在 app/views/pages 下创建 home.html.erb、about.html.erb 和 contact.html.erb 视图。这些视图包含您在静态页面上想要的任何内容。默认情况下,它们会使用您应用的 application.html.erb 布局。

    您还需要查看 page caching 以提高自己的性能。


    方法 #2 - 将内容存储在数据库中

    我使用的另一种方法是为静态页面制作一个非常基本的 CMS。在这种情况下,页面在模型中表示。它使用friendly_id gem 处理每个页面的 slug,以便可以通过 URL 中的漂亮名称(例如 /about)而不是 ID 来检索它们。

    page.rb:

    class Page < ActiveRecord::Base
      attr_accessible :title, :content
    
      validates_presence_of :title, :content
    
      has_friendly_id :title, :use_slug => true, :approximate_ascii => true
    end
    

    pages_controller.rb:

    class PagesController < ApplicationController
      def show
        @page = Page.find(params[:id])
        render 'shared/404', :status => 404 if @page.nil?
      end
    end
    

    show.html.erb:

    <%= raw @page.content %>
    

    routes.rb:

    match '/:id' => 'pages#show'
    

    注意:将此条目放在 routes.rb 的末尾,因为它匹配所有内容。

    然后,您希望如何创建、编辑和更新页面取决于您 - 您可以拥有一个管理界面,或者以某种方式将其构建到您的公共界面中。这种方法也可以从页面缓存中受益。

    【讨论】:

    • 你甚至不需要在控制器中包含空方法。编辑:另外,你可以把它作为一种'catch all'路由放在其他所有东西之后:匹配':action'=>'pages'以避免在添加新页面时需要更新路由。但是,如果您有很多复杂的路线,您可能需要小心。
    • 非常感谢 Jeff,你说的很对!我的想法是 2. 方法,但我不知道如何制作这样漂亮的网址。再次感谢您!
    • 您可以为匹配做类似 domain.com/p/blog-post-slug 的操作,然后将其匹配到 /p/:id。 P 代表“post”,可以是任何东西。我认为这比 match any 路线要好。
    • 什么是:approximate_ascii?我找不到关于它的文档。但是,我假设它使用 ASCII 来近似 UTF-8 字符,这是现在的默认值。 github.com/FriendlyId/friendly_id/blob/master/lib/friendly_id/…
    • @page = Page.find(params[:id]) 应更改为 @page = Page.find_by_id(params[:id]) 否则您将获得默认 404(公开)而不是自定义 404。
    【解决方案2】:

    另一个选项是high_voltage gem:https://github.com/thoughtbot/high_voltage

    这使得创建内容存储在视图中的静态页面变得非常容易。

    【讨论】:

      【解决方案3】:

      Jeff 的方法 #1(将内容存储在视图中并为每个静态页面设置路由和控制器操作)是一种很好的方法。我唯一要添加的是在您的路线中使用controller macro

      所以,不要这样:

      match '/home' => 'pages#home'
      match '/about' => 'pages#about'
      match '/contact' => 'pages#contact'
      

      你可以这样做:

      controller :pages do
        get :home
        get :about
        get :contact
      end
      

      这是两个额外的行,但更加优雅,因为它消除了重复并将您的静态页面路由可视化地组合在一起。

      它还使用get http 动词方法代替matchwhich is a better practice for Rails routes(更简洁,现在Rails 4 requires the http verb to be specified when using match

      【讨论】:

        【解决方案4】:

        Jeff 的方法 #1 对我来说非常有效。这是使控制器动态查找页面的技巧。有了这个,您不需要触摸控制器或 routes.rb 来添加页面。只需将页面拖放到 app/views/pages 下,控制器就会找到它。

        class PagesController < ApplicationController
          def show
            render params[:id]
          end
        end
        

        【讨论】:

        • 这对我有用,但只有当我有比赛或进入路线时。为了不必列出 route.rb 中的所有路由,是否还需要做其他事情?使用 rails 3.2.12
        • 始终警惕您对用户输入的操作。我没有对此进行测试,但render 可以访问每个视图,所以我会担心看起来像admin/whateverparams[:id]。 FWIW,只要该视图存在于与您的控制器对应的视图文件夹中,Rails 就会自动呈现视图而无需创建控制器操作。您需要做的就是添加适当的路线,这没什么大不了的。
        【解决方案5】:

        查看 Michael Hartl 的 http://railstutorial.org 它有 2.3.8 和 3.0.x 版本。它通过很好的示例涵盖了这一点,并引导您尽早构建它们,您还将有机会学到比这个示例更多的东西。 我强烈推荐它。

        【讨论】:

        • 现在有 3.2 和 4.0 版本。
        【解决方案6】:

        config/routes.rb

        get ':id', to: 'pages#show'
        

        app/controllers/pages_controller.rb

        class PagesController < ApplicationController
          def show
            begin
              render params[:id]
            rescue ActionView::MissingTemplate
              render :file => "#{Rails.root}/public/404", :layout => false, :status => :not_found
            end
          end
        end
        

        然后将您的静态页面放在 app/views/pages/{name}.html.erb(或任何模板格式)中。

        【讨论】:

          【解决方案7】:

          您可以使用Jekyll bootstrapJekyll using Danger blog 创建静态页面

          参考非常有帮助。

          【讨论】:

            【解决方案8】:

            对您的问题的充分回答基本上看起来像是对 Rails 框架的介绍:至少是 MVC 结构、模板和路由 DSL。 Jeff 给了一个很好的答案,但他的回答仍然假设您有很多基本的 Rails 知识。

            不过,我建议,如果您的 web 应用程序真的那么简单,Rails 可能会矫枉过正。我会研究一些更轻松的东西,比如Sinatra,它的学习曲线比 Rails 低得多,并且在这类事情上做得很好,而无需处理复杂的路由、魔术 MVC 动作/模板映射等。

            【讨论】:

              【解决方案9】:

              我建议将您的页面添加到公用文件夹中,以便直接提供服务,而无需通过 Rails。不过我不是专家,所以我不确定如果页面是静态的,这是否会有任何缺点。

              【讨论】:

              • 这可以称为粗略的解决方案。这将不允许我们利用 Rails 提供的功能,尤其是 Common Layout DesignPage Caching。不过,我不会完全放弃这个解决方案。
              • 如果您将 Apache 或 Nginx 之类的东西配置为为您的 public 文件夹中的页面提供服务,那么这种技术会很快变得轻松,但它会放弃页面上的任何类型的动态内容,例如导航栏显示用户的登录/退出状态。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2013-04-27
              • 1970-01-01
              • 2011-07-11
              • 2016-06-20
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多