Alguien me puede ayudar con un pequeño problema de programacion ruby?

30 views
Skip to first unread message

Oscar Martinez

unread,
Nov 2, 2017, 4:35:31 PM11/2/17
to Madrid.rb

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



A continuación enseño el contenido de los ficheros relevantes:



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

Alberto Fernández-Capel

unread,
Nov 2, 2017, 5:58:46 PM11/2/17
to madr...@googlegroups.com
Creo que el problema lo tienes en la línea 

@user.balance = balance: (@user.balance += @order.price)

Ruby va a interpretar la parte derecha de la asignación como un Hash, es decir que vas a tratar de asignar un hash al attributo balance que es un integer en la base de datos.

Prueba a cambiarla a

@user.update_attributes!(balance: @user.balance + @order.price)

Espero que te ayude,

-- Alberto



--
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.

Reply all
Reply to author
Forward
0 new messages