Hola todos,
Soy
nuevo programando en ruby y queria preguntar si alguien me podía orientar con una pequeña aplicacion que estoy
desarrollando.
Se trata de una aplicación de trueque de productos
utilizando una moneda virtual basica.
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)
Verais en orders_controller las siguientes lineas de codigio que son las que yo espero que pasen los valores a la DB:
@user.balance = balance: (@user.balance += @order.price)
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!
Creeis
que el codigo @user.balance = balance: (@user.balance +=
@order.price), es el apropiado ?
En lugar de estar en orders_controller deberia estar en otra parte?
Mi intencion es solucionar el problema con los ficheros rb existentes y no crear nuevos.
Cualquier orientacion sera bienvenida.
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
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)
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)
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
routes.rb:
Rails.application.routes.draw do
devise_for :users
get 'pages/index'
resources :products
resources :users
resources :products do
resources :orders, only: [:create]
end
resources :orders, only: [:show]
get '/user_orders' => 'orders#user_orders'
end
--
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.