首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Rails中继承和路由来自ApplicationController的自定义操作

在Rails中继承和路由来自ApplicationController的自定义操作
EN

Stack Overflow用户
提问于 2010-10-22 23:19:37
回答 4查看 1.3K关注 0票数 0

我使用的是Rails 2.3.2,但我确信这也适用于更新的版本。我想在ApplicationController中定义一个自定义操作。但是,我不想为每个使用此操作的控制器子类添加自定义路由。有什么简单的方法可以做到这一点吗?

我的第一个倾向是直接路由到ApplicationController,因为该方法不需要被任何子类覆盖。但我不认为Rails再也不能让您路由到ApplicationController。

其他人提出了类似这样的建议:

代码语言:javascript
运行
复制
map.connect ":controller/:action", :controller => my_regex, :action => my_regex

但我想知道这是否有可能与其他路线冲突或覆盖其他路线?或者如果有更好的方法呢?谢谢!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-11-12 03:27:33

最后,我决定把我的js_form_builder作为它自己的资源,所以我有一个控制器来提供它。控制器接受可选的resource_name和id参数。如果提供,我可以像这样实例化一个对象:

代码语言:javascript
运行
复制
@object = params[:resource_name].classify.constantize.find(params[:id]) 

然后,我只需发送一个包含我所有js_form_builder优点的js.erb模板。如果@object已经被实例化,那么我可以创建一个form_for @ object,然后遍历它的属性,并在javascript表单构建器对象上创建方法,该方法将使用Rails FormBuilder标记来创建每个属性的输入。

例如:

代码语言:javascript
运行
复制
window.FormBuilder = function() {
  var builder = {};

  builder.form = function() {
    var js = "";
    js += '<%= form_for @object do |f| %>';
    <% @object.attributes.each do |name, val| %>  
      var methodName = '<%= name.camelize(:lower) %>';
      <% if val.class == String %>
        builder[methodName] = $('<%= f.text_field name.to_sym  %>');
      <% end %>
      <% if val.class == TrueClass || val.class == FalseClass %>  
        builder[methodName] = $('<%= f.check_box name.to_sym %> <%= f.label name.to_sym %>');
      <% end %>    
    <% end %>
    js += '<% end %>';
    return $(js);
  };  

  builder.newForm = function() {
    var js = "";
    js += '<%= form_for @object.class.new do |f| %>';
    js += '<% end %>';  
  }

  return builder;
}

目前我不确定这些输入会有多大用处,因为我想不出不使用html.erb的场景。但让它工作起来确实很有趣!:)

票数 0
EN

Stack Overflow用户

发布于 2010-10-22 23:39:22

我认为这不是修改ApplicationController的问题,而是在ActionDispatch::Routing中修补代码以包含您想要的新操作的情况。在方案中,这似乎是一件非常疯狂的事情,因为没有标准的方法来增强或扩展通常的REST操作。我希望你有一个很好的理由这样做。

在浏览代码时,您可以看到定义默认操作的位置,并且可以引入一个新的操作。Rails 3的结构略有不同,但想法是相同的:

代码语言:javascript
运行
复制
    class ActionDispatch::Routing::Mapper::Resources::Resource
      ENHANCED_DEFAULT_ACTIONS = DEFAULT_ACTIONS + [ :myaction ]

      def self.default_actions
        ENHANCED_DEFAULT_ACTIONS
      end
    end

您也必须修改ActionDispatch::Routing::Mapper::Resources#resources以改变其行为,但是您没有指定您正在谈论的是集合、新的还是成员类型的操作,因此您只需复制和修改例程以使其行为符合您的期望。

票数 0
EN

Stack Overflow用户

发布于 2010-10-22 23:43:14

如果要将此控制器声明为map.resource等资源,则必须使用默认操作,或者通过向该资源添加membercollection来创建自己的操作。

代码语言:javascript
运行
复制
 map.resources :post, :member => {:update_live_boolean => :post }, :collection => {:get_all_live_posts => :get}

否则,如果您使用的是旧的路由格式,而不使用REST

代码语言:javascript
运行
复制
  map.connect ':controller/:action/:id'
  map.connect ':controller/:action/:id.:format'

然后,要链接到自定义控制器,您只需在需要时提供:controller' and:action/:id`变量

代码语言:javascript
运行
复制
<%= link_to "New Custom Controller", {:controller => "new_custom_controller", :action => "index"%>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3998286

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档