如何为内容页面简化此rails控制器?

时间:2014-05-12 18:03:40

标签: ruby-on-rails

我有以下类,但它有很多重复的代码。有没有办法简化这个,这样我就不必为每个页面记录添加一个新方法(这也允许客户端随意添加页面)。这是当前的控制器:

    class StaticController < ApplicationController
      def privacy_policy
        @page = Page.find_by_slug 'privacy_policy'
        render 'static/page'
      end

      def terms
        @page = Page.find_by_slug 'terms'
        render 'static/page'
      end

      def about
        @page = Page.find_by_slug 'about'
        render 'static/page'
      end
    end

3 个答案:

答案 0 :(得分:1)

您可以在Page模型中编写一个类方法:

def self.page_by_slug(slug)
  Page.find_by_slug(slug)
end

在您的StaticController中,您可以传入一个参数(基于用户操作)并使用before_action回调渲染静态页面:

class StaticController < ApplicationController
  before_action :render_static_page

  def static_page
    @page = Page.page_by_slug(params[:slug])
  end

  private
  def render_static_page
   render 'static/page'
  end
end

答案 1 :(得分:0)

您可以在控制器顶部添加before_action

class StaticController < ApplicationController
    before_action :_render_template, :only => [:privacy_policy, :terms, :about]

    def privacy_policy
      @page = Page.find_by_slug 'privacy_policy'
    end

    def terms
      @page = Page.find_by_slug 'terms'
    end

    def about
      @page = Page.find_by_slug 'about'
    end

    private
    def _render_template
       render 'static/page'
    end
  end

答案 2 :(得分:0)

首先你需要为你的应用程序添加一个catch所有路由,重要的是路由是你的路由文件中的最后一个东西,因为它会捕获每个url:

match '*slug' => 'static#show'

从路径文件中删除您为原始3个操作定义的所有静态路由,不再需要它们。

接下来修改静态控制器,如下所示:

class StaticController < ApplicationController

  def show
    @page = Page.find_by_slug(params[:slug])
    render 'static/page'
  end

end

我已经省略了对页面等存在的任何检查......我会把它留给你;)