#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% решения, другая половина — получение данных и обновление их в базе данных, и это делается через контроллер. Поскольку вы не дали никаких намеков относительно схемы, вам придется либо заняться этим самостоятельно, либо объяснить более подробно, чтобы мы могли дать более конкретные рекомендации.