Ruby on rails 如何在使用活动资源时从url中删除.xml和.json

Ruby on rails 如何在使用活动资源时从url中删除.xml和.json,ruby-on-rails,Ruby On Rails,当我在活动资源中进行映射时,它对RubyonRails的默认请求总是自动在url的末尾添加扩展。 例如: 我想通过如下映射从Ruby on Rails获取用户资源: class user < ActiveResource::Base self.site = 'http://localhost:3000' end 类用户< ActiveResource::Base 自助站点http://localhost:3000' 结束 我需要的是,我只想让它不带扩展名地传递url,相反,它会在ur

当我在活动资源中进行映射时,它对RubyonRails的默认请求总是自动在url的末尾添加扩展。 例如: 我想通过如下映射从Ruby on Rails获取用户资源:

class user < ActiveResource::Base self.site = 'http://localhost:3000' end 类用户< ActiveResource::Base 自助站点http://localhost:3000' 结束 我需要的是,我只想让它不带扩展名地传递url,相反,它会在url的末尾自动添加扩展名,比如

http://localhost:3000/user http://localhost:3000/user.xml
当我从活动资源映射发出请求时,如何省略url的扩展名?

您可以通过覆盖类中的两个ActiveResource方法来实现这一点:

class User < ActiveResource::Base
  class << self
    def element_path(id, prefix_options = {}, query_options = nil)
      prefix_options, query_options = split_options(prefix_options) if query_options.nil?
      "#{prefix(prefix_options)}#{collection_name}/#{id}#{query_string(query_options)}"
    end

    def collection_path(prefix_options = {}, query_options = nil)
      prefix_options, query_options = split_options(prefix_options) if query_options.nil?
      "#{prefix(prefix_options)}#{collection_name}#{query_string(query_options)}"
    end
  end

  self.site = 'http://localhost:3000'
end
class用户类您可以重写ActiveResource::Base的方法

在/lib/active\u resource/extend/目录中添加此库别忘了取消注释
config/application.rb中的“config.autoload_路径+=%W(#{config.root}/lib)”

module-ActiveResource#:nodoc:
模块扩展
无扩展的模块
模块类方法
带有扩展名(*args)的def元素路径
不带扩展名(*args).gsub(/.json |.xml/,'')的元素路径
结束
带有扩展名(*args)的定义新元素路径
不带扩展名(*args).gsub(/.json |.xml/,'')的新元素路径
结束
带有扩展名(*args)的def集合路径
不带扩展名(*args).gsub(/.json |.xml/,'')的集合路径
结束
结束
def自带(基本)
基本类\u评估do
扩展类方法

class一开始,我确实使用了@Joel AZEMAR的答案,在我开始使用PUT之前,它运行得非常好。 在.json/.xml中添加PUT

稍微透露一下,使用
ActiveResource::Base#include_format_in_path
选项对我来说效果更好

在路径中不包含格式:

class Foo < ActiveResource::Base
  self.site = 'http://localhost:3000'
end

Foo.element_path(1)
=> "/foo/1.json"
class Foo < ActiveResource::Base
  self.include_format_in_path = false
  self.site = 'http://localhost:3000'
end

Foo.element_path(1)
=> "/foo/1"
class Foo“/foo/1.json”
在路径中包含格式:

class Foo < ActiveResource::Base
  self.site = 'http://localhost:3000'
end

Foo.element_path(1)
=> "/foo/1.json"
class Foo < ActiveResource::Base
  self.include_format_in_path = false
  self.site = 'http://localhost:3000'
end

Foo.element_path(1)
=> "/foo/1"
class Foo“/foo/1”

这种方法效果很好,而且比其他解决方案干净得多。谢谢