Как обновить значение в хэше?

#ruby-on-rails #ruby

#ruby-on-rails #ruby

Вопрос:

У меня есть модель корзины. У каждой корзины есть количество, которое является хэшем. Я отображаю корзину в edit.html.erb.

Это выглядит так: введите описание изображения здесь

Я хочу добавить возможность редактировать второй столбец. Это значение хэша. Смотрите комментарий в следующем коде:

 <table class="table table-bordered">
  <tr class="head-of-table">
    <th>Продукт</th>
    <th>Количество</th>
    <th>Цена</th>
  </tr>
  <% current_user.cart.quantity.each do |k,v| %>
    <tr>
      <td>
        <%= k %>
      </td>
      <td>
        <%= v %>
        <%= text_field_tag v # here I want to put a field and a button for updating this hash %>
      </td>
      <td>
        <% i = Item.find_by(name: k) %>
        <%= i.price * v.to_f %>
      </td>
    </tr>
  <% end %>
</table>
  

UPD:

Контроллер корзины:

 class CartController < ApplicationController

  def edit
    unless current_user
      redirect_to new_user_registration_url
    else
      @items = current_user.cart.items
      @cart = current_user.cart
    end
  end

  def update
    @cart = current_user.cart

    @cart.update(cart_params)
  end

  def make_an_order
    @items = current_user.cart.items.all
    @cart = current_user.cart
    @cart.price = @cart.final_price(@items)
    @cart.quantity = @cart.correct_quantity(@items)
    @cart.save
    redirect_to new_order_path
  end

  private 

    def cart_params
      params.require(:comment).permit(:price, :quantity)
    end

end 
  

Модель корзины:

 class Cart < ActiveRecord::Base

  belongs_to  :user
  has_many    :positions
  has_many    :items, through: :positions

  def final_price (items)
    self.price = 0
    items.each do |i|
      self.price  = i.price if i.price
    end
    self.save
    return price
  end

  def correct_quantity(items)
    h = Hash.new(0)
    array = Array.new
    items.each do |i|
      array << i.name
    end
    array.each{|e| h[e]  = 1}
    self.quantity = h
    self.save
    return h
  end

end
  

Схема:

 create_table "carts", force: :cascade do |t|
    t.integer  "user_id"
    t.datetime "created_at",               null: false
    t.datetime "updated_at",               null: false
    t.float    "price",      default: 0.0
    t.hstore   "quantity",   default: {},  null: false
end
  

Итак, еще раз: у корзины есть хэш (hstore).
Этот хэш я использую для удобного отображения товаров в корзине (см. correct_quantity ). Ключ — это имя элемента, а значение — количество.
Я хочу добавить для пользователей возможность редактировать количество товаров в корзине. Из-за использования хэша я не знаю, как это сделать.

Комментарии:

1. Помните, что единственный способ сохранить данные между запросами — это использовать сеанс пользователя, аргументы GET или POST или хранилище данных, например базу данных или файл на диске. Манипулирование переменными в Ruby актуально только во время выполнения запроса , а затем они удаляются. Это не похоже на приложение для Android, где есть постоянное представление и контроллер до тех пор, пока кто-то использует приложение.

2. @tadman Ваш комментарий настолько полезен (на самом деле нет). Мне нужно что-то вроде формы для моих методов редактирования и обновления в контроллере корзины. Я не знаю, как написать такую форму. И, конечно, этот хэш хранится в базе данных.

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

4. @DartNyan Я думаю, вы не читали слишком много сообщений в других местах. Просто предположение. Если бы вы это сделали , вы бы знали, что tadman зарегистрировался довольно низко, как ноль, в высокомерном спектре. Так что расслабьтесь.

5. Возможно, здесь есть проблема с пониманием, но я просто пытаюсь направить вас к ресурсам, которые помогут вам обоим понять, как Rails рассматривает подобные проблемы и как вы можете найти решение. Добавление поля — это только 50% решения, другая половина — получение данных и обновление их в базе данных, и это делается через контроллер. Поскольку вы не дали никаких намеков относительно схемы, вам придется либо заняться этим самостоятельно, либо объяснить более подробно, чтобы мы могли дать более конкретные рекомендации.