Как я могу "инициализировать" переменную экземпляра? - PullRequest
0 голосов
/ 09 апреля 2020

Я просто пытаюсь изучить Rails.

Каждый раз, когда я отправляю запрос get через почтальона, вызывается метод initialize, поэтому я не могу поддерживать массив @data, потому что @data инициализируется при каждом запросе. Есть ли способ инициализировать @data один раз и позволить методам создания, обновления, уничтожения работать правильно?

class BooksController < ApplicationController
    skip_before_action :verify_authenticity_token

    def initialize
        super
        @data = [
            { title: "Harry Potter", author: "J.K Rowling" },
            { title: "Name of the wind", author: "Patrick Rothfuss" }
        ]
    end

    def index
        render json: @data
    end

    def create
        @data.push(params[:book])
        render json: @data
    end
end

Ответы [ 2 ]

1 голос
/ 09 апреля 2020

Если вы хотите сохранить что-либо между запросами, вам нужно его где-то сохранить:

  • База данных
  • Память на основе памяти (Redis, Memcached)
  • Файловая система

Вы также можете передавать состояние назад и вперед между клиентом и сервером, не сохраняя его с помощью:

  • HTTP-куки
  • Параметры строки запроса

Использование переменной класса на самом деле ничего не решит. Она будет содержать переменную, пока класс находится в памяти. Каждый раз, когда класс перезагружается, он сбрасывается.

Многопоточность - еще одна огромная проблема, поскольку серверы Rails обычно многопоточные, а переменные класса не являются поточно-ориентированными.

0 голосов
/ 09 апреля 2020

Потому что я просто не хотел пока использовать какую-либо базу данных и знал, что каждый запрос создает новый экземпляр BooksController. Чтобы этот код работал, следующие изменения могут решить его.

class BooksController < ApplicationController
    skip_before_action :verify_authenticity_token

    @@data = [
        { title: "Harry Potter", author: "J.K Rowling" },
        { title: "Name of the wind", author: "Patrick Rothfuss" }
    ]

    def index
        render json: @@data
    end

    def create
        @@data.push(params[:book])
        render json: @@data
    end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...