--
Has recibido este mensaje porque estás suscrito al grupo "Madrid.rb" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a madrid-rb+unsubscribe@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a madr...@googlegroups.com.
Visita este grupo en https://groups.google.com/group/madrid-rb.
Para acceder a más opciones, visita https://groups.google.com/d/optout.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a madrid-rb+...@googlegroups.com.
Hola Enrique,
Primero que todo en hora buena por el estupendo evento mensual de Ruby que he tenido el placer de visitar algunas veces.
Soy
nuevo programando en ruby y queria preguntarte si a lo mejor me
puedes dar alguna orientacion con una pequeña aplicacion que estoy
desarrollando y con la cual tengo un problemilla. Se trata de una pagina de trueque de productos
utilizando una moneda virtual (creditos dentro de la aplicacion).
Mi problema es con la actualizacion del balance de cada usuario una vez que ha efectuado una transaccion.
Los modelos de la aplicacion son: User, Product and Order.
Quisiera que cada vez que un usuario haga un pedido ( aqui “order” hace las veces de una transaccion), el valor de la compra se añada al balance del usuario (aqui “price” hace las veces de cantidad o amount)
Veras en orders_controller las siguientes lineas de codigio que deberian pasar los valores a la DB:
@user.balance = balance: (@user.balance += @order.price)
Cuando yo sepa como efectuar estas actualizaciones del balance me gustaria discriminar el usuario entre comprador y vendedor de manera que el balance de uno se incremente y el otro se reduzca, segun el valor de la transaccion.
Por
esta razon veras en order.rb las siguientes lineas que todavia esta inactivo
#has_one :buyer, :class_name => 'User', :foreign_key => 'buyer_id'
#has_one :seller, :class_name => 'User', :foreign_key => 'seller_id'
De manera que despues @user.balance sea remplazado por algo asi como @buyer.balance y @seller.balance
De momento un usuario puede mirar su balance que por default es de 100 unidades. Asi mismo el usuario puede efectuar un pedido (order) y este quedara registrado en la DB.
! Mi problema es que no logro que el valor de la "order" pase a modificar el total del balance del usuario!
Crees
que el codigo @user.balance = balance: (@user.balance +=
@order.price), tiene sentido?
En lugar de estar en orders_controller deberia estar en otra parte?
Cualquier orientacion que me puedas dar sera bienvenida.
Y si no tienes tiempo me gustaria lanzar esta consulta a la comunidad Ruby de Madrid. Sabe como podria hacerlo?
Muchas gracias y saludos!!
Oscar
User.rb:
class User < ActiveRecord::Base
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
validates :fullname,presence: true
validates :description, presence: false
validates :balance, presence: true, numericality:true
before_validation :load_defaults
def load_defaults
if self.new_record?
self.balance = 100
end
end
has_many :products
has_many :orders
end
order.rb
class Order < ActiveRecord::Base
belongs_to :user
belongs_to :product
#has_one :buyer, :class_name => 'User', :foreign_key => 'buyer_id'
#has_one :seller, :class_name => 'User', :foreign_key => 'seller_id'
validates :price, presence: true
validates :product_id, presence: true
validates :user, presence: true
end
product.rb
class Product < ActiveRecord::Base
belongs_to :user
has_many :orders
end
orders.controller
class OrdersController < ApplicationController
before_action :authenticate_user!
def create
@order = current_user.orders.create(order_params)
@user.balance = balance: (@user.balance += @order.price)
@user.balance = balance: (@user.balance -= @order.price)
redirect_to user_orders_path
end
end
def user_orders
@orders = current_user.orders
end
private
def order_params
params.require(:order).permit(:price, :user_id, :product_id, :seller_id, :buyer_id)
end
end
users:controller.rb
class UsersController < ApplicationController
def show
@user = User.find(params[:id])
@products = @user.products
end
end
products_controller.rb
class ProductsController < ApplicationController
before_action :set_product, only: [:show, :edit, :update, :destroy]
before_action :authenticate_user!, except: [:show]
def index
@products = current_user.products
end
def show
end
def new
@product = current_user.products.build
end
def edit
end
def create
@product = current_user.products.build(product_params)
respond_to do |format|
if @product.save
format.html { redirect_to @product, notice: 'Product was successfully created.' }
format.json { render :show, status: :created, location: @product }
else
format.html { render :new }
format.json { render json: @product.errors, status: :unprocessable_entity }
end
end
end
def update
respond_to do |format|
if @product.update(product_params)
format.html { redirect_to @product, notice: 'Product was successfully updated.' }
format.json { render :show, status: :ok, location: @product }
else
format.html { render :edit }
format.json { render json: @product.errors, status: :unprocessable_entity }
end
end
end
def destroy
@product.destroy
respond_to do |format|
format.html { redirect_to products_url, notice: 'Product was successfully destroyed.' }
format.json { head :no_content }
end
end
private
def set_product
@product = Product.find(params[:id])
end
def product_params
params.require(:product).permit(:name, :description, :price)
end
end
views/users/show.html.rb
<p>
User name: <%= @user.fullname %>
</p>
<p>
Balance: <%= @user.balance %>
</p>
Schema.rb:
ActiveRecord::Schema.define(version: 20171031150052) do
create_table "orders", force: :cascade do |t|
t.integer "user_id"
t.integer "product_id"
t.integer "price"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.string "transactiontype"
t.integer "buyer_id"
t.integer "seller_id"
end
add_index "orders", ["product_id"], name: "index_orders_on_product_id"
add_index "orders", ["user_id"], name: "index_orders_on_user_id"
create_table "products", force: :cascade do |t|
t.string "name"
t.text "description"
t.integer "price"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "user_id"
end
add_index "products", ["user_id"], name: "index_products_on_user_id"
create_table "users", force: :cascade do |t|
t.string "email", default: "", null: false
t.string "encrypted_password", default: "", null: false
t.string "reset_password_token"
t.datetime "reset_password_sent_at"
t.datetime "remember_created_at"
t.integer "sign_in_count", default: 0, null: false
t.datetime "current_sign_in_at"
t.datetime "last_sign_in_at"
t.string "current_sign_in_ip"
t.string "last_sign_in_ip"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.string "fullname"
t.string "description"
t.integer "balance"
end
add_index "users", ["email"], name: "index_users_on_email", unique: true
add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
end
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a madrid-rb+unsubscribe@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a madr...@googlegroups.com.
Visita este grupo en https://groups.google.com/group/madrid-rb.
Para acceder a más opciones, visita https://groups.google.com/d/optout.
--
Has recibido este mensaje porque estás suscrito a un tema del grupo "Madrid.rb" de Grupos de Google.
Para cancelar la suscripción a este tema, visita https://groups.google.com/d/topic/madrid-rb/8U9Sr-DvLgI/unsubscribe.
Para cancelar la suscripción a este grupo y a todos sus temas, envía un correo electrónico a madrid-rb+unsubscribe@googlegroups.com.