我使用的是Rails 2.3.2,但我确信这也适用于更新的版本。我想在ApplicationController中定义一个自定义操作。但是,我不想为每个使用此操作的控制器子类添加自定义路由。有什么简单的方法可以做到这一点吗?
我的第一个倾向是直接路由到ApplicationController,因为该方法不需要被任何子类覆盖。但我不认为Rails再也不能让您路由到ApplicationController。
其他人提出了类似这样的建议:
map.connect ":controller/:action", :controller => my_regex, :action => my_regex但我想知道这是否有可能与其他路线冲突或覆盖其他路线?或者如果有更好的方法呢?谢谢!
发布于 2010-11-12 03:27:33
最后,我决定把我的js_form_builder作为它自己的资源,所以我有一个控制器来提供它。控制器接受可选的resource_name和id参数。如果提供,我可以像这样实例化一个对象:
@object = params[:resource_name].classify.constantize.find(params[:id]) 然后,我只需发送一个包含我所有js_form_builder优点的js.erb模板。如果@object已经被实例化,那么我可以创建一个form_for @ object,然后遍历它的属性,并在javascript表单构建器对象上创建方法,该方法将使用Rails FormBuilder标记来创建每个属性的输入。
例如:
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的场景。但让它工作起来确实很有趣!:)
发布于 2010-10-22 23:39:22
我认为这不是修改ApplicationController的问题,而是在ActionDispatch::Routing中修补代码以包含您想要的新操作的情况。在方案中,这似乎是一件非常疯狂的事情,因为没有标准的方法来增强或扩展通常的REST操作。我希望你有一个很好的理由这样做。
在浏览代码时,您可以看到定义默认操作的位置,并且可以引入一个新的操作。Rails 3的结构略有不同,但想法是相同的:
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以改变其行为,但是您没有指定您正在谈论的是集合、新的还是成员类型的操作,因此您只需复制和修改例程以使其行为符合您的期望。
发布于 2010-10-22 23:43:14
如果要将此控制器声明为map.resource等资源,则必须使用默认操作,或者通过向该资源添加member或collection来创建自己的操作。
map.resources :post, :member => {:update_live_boolean => :post }, :collection => {:get_all_live_posts => :get}否则,如果您使用的是旧的路由格式,而不使用REST
map.connect ':controller/:action/:id'
map.connect ':controller/:action/:id.:format'然后,要链接到自定义控制器,您只需在需要时提供:controller' and:action/:id`变量
<%= link_to "New Custom Controller", {:controller => "new_custom_controller", :action => "index"%>https://stackoverflow.com/questions/3998286
复制相似问题