2012-06-22 6 views
6

У меня есть файл на моем сервере, который находится за пределами моего каталога приложений. Это текстовый файл, содержащий объект json, /path/to/data.json.Как обслуживать статический файл JSON в рельсах?

Каков самый простой способ обслуживания этого файла в Rails, например. вернуть его в ответ на запрос GET?

Вот что я пробовал до сих пор, вдохновленный this answer и другими. (Это может быть путь вне базы. - Я новичок в рельсах)

  1. добавили эту строку routes.rb resources :data

  2. писал data_controller.rb

class DataController < ApplicationController

@data = File.read("/path/to/data.json") 

def index 
    render :json => @data 
end 
end 

Это не работает. Когда я направляю свой браузер на http://myserver.com/data.json, я просто вижу «нуль» вместо файла data.json.

Любая идея, что я делаю неправильно?

+1

Если форматом файла является JSON, вам действительно нужно «ActiveSupport :: JSON.decode», если вы только намерены передать его как JSON? –

+0

Наверное, нет ... позвольте мне взять эту строку и посмотреть, что произойдет ... –

+0

Хм .. я сомневаюсь, что это все равно будет работать, вы все равно просто визуализируете '@ data'. '@ dataJson' никогда не используется. –

ответ

11

Я думаю, что это вопрос с охватом; ваши внешние @data не совпадают с @data в методе. То есть вы не можете использовать переменные экземпляра, как ожидалось, вне методов, потому что пока нет экземпляра.

Он должен работать, если вы используете переменную класса, например

@@data = File.read("/path/to/data.json") 

затем

render :json => @@data 
+0

Блестящий, спасибо! Это решило проблему. Я еще не узнал об области переменных в Rails. Я пойду именно так. ;) –

7

Положить в public/assets/javascripts. Или app/assets/javascripts. Сервер может даже вернуть правильный тип контента.

+0

Хорошо, это может быть одно решение, и, вероятно, это правильный путь, как только мое приложение начнет жить. Но пока, пока он все еще находится в разработке, было бы намного удобнее для файла жить в другом месте, за пределами 'public/assets /'. 'data.json' обращается к другим приложениям, а также к рельсам, и для простоты я хочу сохранить только одну копию. –

4
  • положить файл "data.json" в каталог проекта (например, «общественность/данные .json ")
  • @data = File.read (" # {Rails.root} /public/data.json ")
  • Наконец, но не менее важно: json => @data
Смежные вопросы