我有以下类,但它有很多重复的代码。有没有办法简化这个,这样我就不必为每个页面记录添加一个新方法(这也允许客户端随意添加页面)。这是当前的控制器:
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
答案 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
我已经省略了对页面等存在的任何检查......我会把它留给你;)