Как удалить .xml и .json из URL при использовании активного ресурса - PullRequest
11 голосов
/ 20 апреля 2009

Когда я делаю отображение в активном ресурсе, его запрос по умолчанию к Ruby on Rails всегда автоматически добавляет расширение в конце URL. Например: Я хочу получить пользовательский ресурс из Ruby on Rails, сопоставив его следующим образом:

class user &lt ActiveResource::Base
  self.site = 'http://localhost:3000'
end

И что-то, что мне нужно, я просто хочу передать URL без расширения, как

<a href="http://localhost:3000/user" rel="noreferrer">http://localhost:3000/user</a>
В отличие от этого, оно автоматически добавляет расширение в конце URL, как
<a href="http://localhost:3000/user.xml" rel="noreferrer">http://localhost:3000/user.xml</a>

Как я могу опустить расширение URL, когда я делаю запрос из сопоставления активного ресурса?

Ответы [ 3 ]

12 голосов
/ 07 марта 2014

Сначала я использовал ответ @Joel AZEMAR, и он работал довольно хорошо, пока я не начал использовать PUT. Делать PUT добавлено в .json / .xml.

Небольшое исследование здесь показало, что использование опции ActiveResource::Base#include_format_in_path работает намного лучше для меня.

Без include_format_in_path:

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

Foo.element_path(1)
=> "/foo/1.json"

С помощью include_format_in_path:

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

Foo.element_path(1)
=> "/foo/1"
4 голосов
/ 25 мая 2011

Вы можете переопределить методы ActiveResource :: Base

Добавьте эту библиотеку в каталог / lib / active_resource / extend /, не забудьте раскомментировать
"config.autoload_paths + =% W (# {config.root} / lib)" in config / application.rb

module ActiveResource #:nodoc:
  module Extend
    module WithoutExtension
      module ClassMethods
        def element_path_with_extension(*args)
          element_path_without_extension(*args).gsub(/.json|.xml/,'')
        end
        def new_element_path_with_extension(*args)
          new_element_path_without_extension(*args).gsub(/.json|.xml/,'')
        end
        def collection_path_with_extension(*args)
          collection_path_without_extension(*args).gsub(/.json|.xml/,'')
        end
      end

      def self.included(base)
        base.class_eval do
          extend ClassMethods
          class << self
            alias_method_chain :element_path, :extension
            alias_method_chain :new_element_path, :extension
            alias_method_chain :collection_path, :extension
          end
        end
      end  
    end
  end  
end

в модели

class MyModel < ActiveResource::Base
  include ActiveResource::Extend::WithoutExtension
end
3 голосов
/ 01 июля 2009

Вы можете сделать это, переопределив два метода 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...