Ruby on Rails:动态函数名,基于数据库

时间:2014-09-11 05:45:25

标签: ruby-on-rails ruby ruby-on-rails-3 controller

如何使用数据库中的数据在rails中创建动态功能名称?我不知道这是否可能。

以下是我的目标示例

class PageController < ApplicationController
  def (PageModel.find(1)) #def stay
   #codes here            #codes here
  end                     #end
end

我知道语法错误。请帮助,谢谢

更新

此功能只能通过路线调用,在我的路线中我有这条线

  

匹配“/:action”,:controller =&gt; “page”,:via =&gt; “获取”

如果手动生成,该函数将如下所示

def stay
 #some query
 render 'stay_page', :layout => 'stay_page_layout'
end

def pleasure 
 #some query
 render 'pleasure _page', :layout => 'pleasure _page_layout'
end

2 个答案:

答案 0 :(得分:0)

假设您的PageModelpage_idpage_name,您的网址会以page_id作为参数,并会使用page_name呈现。

控制器代码:

class PageController < ApplicationController
  def dynamic_action
    page_name = PageModel.find(params[:page_id]).page_name
    render "#{page_name}_page", :layout => "#{page_name}_page_layout"
  end             
end

路线:

match '/:page_id' => 'page#dynamic_action'

答案 1 :(得分:0)

routes.rb

# Either this...
get "pages/:page", to: "pages#page"

# Or this, but make sure this is the last route in the file
get "/:page", to: "pages#page"

你的控制器:

class PageController < ApplicationController
  def page
    @page = PageModel.find(params[:page])
  end
end

如果您只需要根据页面呈现不同的模板,则可以执行以下操作:

def page
  @page = PageModel.find(params[:page])
  render @page.name
end

如果您需要自定义逻辑,您可以执行以下操作:

VALID_PAGES = ["contact_us"]

def page
  @page = PageModel.find(params[:page])
  execute(@page.name)
end

def execute(name)
  if VALID_PAGES.include?(name)
    send(name)
  end
end

def contact_us
  # do stuff
end