Permalänk
Medlem

Ruby on Rails problem

Hej,

Det är så att jag tagit över driften av en site med enormt komplicerad ruby kod (för mig i varje fall).

I grunden är det en guildsida för min wowguild, med egenskapat DKP system av en företagsekonom (och förra hosten av sidan).

Det hela är uppbyggt av pgSQL och Ruby. SQL biten klarar jag av, men Ruby är rena grekiskan för mig.

Basically, vi har fasta priser på saker, normal pris och offspec pris. Förut har bara ett pris sparats i databasen, men jag har fixat en kolumn för att lägga till offspec priset också. Nu hade jag tänkt fixa en fin liten checkbox för att välja vilket pris man vill sälja ett föremål för.

i app/views/raids/edit.haml så har jag lagt till det vid --->:

- form_tag(:controller => "raids", :action => :create_loot, :raid_id => @raid.id) do %table %tr %td= collection_select("loot", "character_id", @characters, "id", "name", { :include_blank => true }) %td= collection_select("loot", "item_id", @items, "id", "name", { :include_blank => true }) %td= collection_select("loot", "mob_id", @raid.zone.mobs, "id", "name", { :include_blank => true }) %td= text_field("loot", "price", { :size => 8 }) ---> %td= check_box("loot", "secondary", { :include_blank => true }, "yes", "no") %td= submit_tag("Add loot")

i app/model/loot.rb :

class Loot < ActiveRecord::Base belongs_to :mob belongs_to :item belongs_to :character belongs_to :raid validates_presence_of :character_id validates_presence_of :item_id validates_presence_of :raid_id validates_numericality_of :price ---> validates_presence_of :secondary def initialize(attributes = nil) ---> if (attributes[:secondary].eql? "yes") ---> attributes[:price] = Item.find(attributes[:item_id]).secondary_price elseif (attributes[:price].length <= 0) attributes[:price] = Item.find(attributes[:item_id]).default_price end super(attributes) end def self.total_value total = self.sum(:price, :include => :character, :conditions => [ "characters.active = ?", true ]) if total.nil? total = 0.0 end return total end end

och i db/schema.rb:

create_table "items", :force => true do |t| t.string "name" t.integer "wowid", :null => false t.float "default_price", :default => 0.0, :null => false t.float "secondary_price", :default => 0.0, :null => false end

Jag har försökt få detta att funka i några veckor nu, men utan ens den minsta Ruby kunskap så har detta nästan fått mig att avsky all form av programmering... Ruby säger ju inte ens var det är fel, den bara säger fel. Om någon kan hjälpa vore jag otroligt tacksam, och om det behövs kan jag fixa SSH access till servern.

Visa signatur

Light travels faster than sound. Is that why some people appear to be smart before they speak?
It's a big rock. I can't wait to tell my friends. They don't have a rock this big.

Permalänk
Medlem

Nånstans måste den ju säga fel..

Uppstår felet när du kör rake db:migrate?

Ett spontan fel jag ser är att elseif ska vara elsif i ruby.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av F4n471c
Nånstans måste den ju säga fel..

Uppstår felet när du kör rake db:migrate?

Ett spontan fel jag ser är att elseif ska vara elsif i ruby.

rake db:migrate ger inga fel

Application error Change this error message for exceptions thrown outside of an action (like in Dispatcher setups or broken Ruby code) in public/500.html

är allt som sidan säger när jag försöker exekvera koden. Inte omöjligt att det går att ändra men han som byggt sidan har inte gjort det.

elsif fungerade inte heller... vet faktiskt inte ens om det är där felet finns... sidan är så enorm med korskopplingar att jag inte har mycket hopp till lösning.

Visa signatur

Light travels faster than sound. Is that why some people appear to be smart before they speak?
It's a big rock. I can't wait to tell my friends. They don't have a rock this big.

Permalänk
Medlem

Felmeddelandena (beroende på RAILS_ENV, om jag kommer ihåg rätt) skrivs ut till konsolen om du kör i utvecklingsläge, samt log/$RAILS_ENV.log

Permalänk
Medlem

vet inte ens hur man startar utvecklingsläge Datorn det körs på är en FreeBSD burk utan X eller skärm som jag SSHar till.

I production.log hittar jag faktiskt:

NoMethodError (undefined method `secondary=' for #<Loot:0x292dda10>): /vendor/rails/activerecord/lib/active_record/attribute_methods.rb:168:in `method_missing' /vendor/rails/activerecord/lib/active_record/base.rb:1812:in `send' /vendor/rails/activerecord/lib/active_record/base.rb:1812:in `attributes=' /vendor/rails/activerecord/lib/active_record/base.rb:1811:in `each' /vendor/rails/activerecord/lib/active_record/base.rb:1811:in `attributes=' /vendor/rails/activerecord/lib/active_record/base.rb:1640:in `initialize_without_callbacks' /vendor/rails/activerecord/lib/active_record/callbacks.rb:225:in `initialize' /app/models/loot.rb:18:in `initialize' /app/controllers/raids_controller.rb:154:in `new' /app/controllers/raids_controller.rb:154:in `create_loot' /vendor/rails/actionpack/lib/action_controller/base.rb:1136:in `send' /vendor/rails/actionpack/lib/action_controller/base.rb:1136:in `perform_action_without_filters' /vendor/rails/actionpack/lib/action_controller/filters.rb:695:in `call_filters' /vendor/rails/actionpack/lib/action_controller/filters.rb:687:in `perform_action_without_benchmark' /vendor/rails/actionpack/lib/action_controller/benchmarking.rb:68:in `perform_action_without_rescue' /usr/local/lib/ruby/1.8/benchmark.rb:293:in `measure' /vendor/rails/actionpack/lib/action_controller/benchmarking.rb:68:in `perform_action_without_rescue' /vendor/rails/actionpack/lib/action_controller/rescue.rb:133:in `perform_action_without_caching' /vendor/rails/actionpack/lib/action_controller/caching.rb:668:in `perform_action' /vendor/rails/activerecord/lib/active_record/query_cache.rb:105:in `cache' /vendor/rails/actionpack/lib/action_controller/caching.rb:667:in `perform_action' /vendor/rails/actionpack/lib/action_controller/base.rb:494:in `send' /vendor/rails/actionpack/lib/action_controller/base.rb:494:in `process_without_filters' /vendor/rails/actionpack/lib/action_controller/filters.rb:683:in `process_without_session_management_support' /vendor/rails/actionpack/lib/action_controller/session_management.rb:122:in `sass_old_process' /vendor/plugins/haml/lib/sass/plugin.rb:124:in `process' /vendor/rails/actionpack/lib/action_controller/base.rb:346:in `process' /vendor/rails/railties/lib/dispatcher.rb:39:in `dispatch' /vendor/rails/railties/lib/webrick_server.rb:112:in `handle_dispatch' /vendor/rails/railties/lib/webrick_server.rb:78:in `service' /usr/local/lib/ruby/1.8/webrick/httpserver.rb:104:in `service' /usr/local/lib/ruby/1.8/webrick/httpserver.rb:65:in `run' /usr/local/lib/ruby/1.8/webrick/server.rb:173:in `start_thread' /usr/local/lib/ruby/1.8/webrick/server.rb:162:in `start' /usr/local/lib/ruby/1.8/webrick/server.rb:162:in `start_thread' /usr/local/lib/ruby/1.8/webrick/server.rb:95:in `start' /usr/local/lib/ruby/1.8/webrick/server.rb:92:in `each' /usr/local/lib/ruby/1.8/webrick/server.rb:92:in `start' /usr/local/lib/ruby/1.8/webrick/server.rb:37:in `start' /usr/local/lib/ruby/1.8/webrick/server.rb:82:in `start' /vendor/rails/railties/lib/webrick_server.rb:62:in `dispatch' /vendor/rails/railties/lib/commands/servers/webrick.rb:65 /usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `gem_original_require' /usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `require' /vendor/rails/activesupport/lib/active_support/dependencies.rb:495:in `require' /vendor/rails/activesupport/lib/active_support/dependencies.rb:342:in `new_constants_in' /vendor/rails/activesupport/lib/active_support/dependencies.rb:495:in `require' /vendor/rails/railties/lib/commands/server.rb:39 /home/joelw/devel/script/server:3:in `require' /home/joelw/devel/script/server:3 Rendering /usr/home/joelw/devel/public/500.html (500 Internal Server Error)

så där kanske jag har felet

Visa signatur

Light travels faster than sound. Is that why some people appear to be smart before they speak?
It's a big rock. I can't wait to tell my friends. They don't have a rock this big.

Permalänk
Medlem

validates_presence_of :secondary

Finns det någon kolumn definierad som heter secondary?

Permalänk
Medlem

i db/schema.rb så har jag

create_table "items", :force => true do |t| t.string "name" t.integer "wowid", :null => false t.float "default_price", :default => 0.0, :null => false t.float "secondary", :default => 0.0, :null => false end create_table "loots", :force => true do |t| t.integer "item_id", :null => false t.integer "raid_id", :null => false t.integer "mob_id" t.integer "character_id" t.float "price", :default => 0.0 t.float "secondary", :default => 0.0 end

och i databasen har jag en column vid namn secondary också.

Har ändrat alla referenser till secondary_price till secondary så det blir mer enhetligt, men problemet kvarstår

Visa signatur

Light travels faster than sound. Is that why some people appear to be smart before they speak?
It's a big rock. I can't wait to tell my friends. They don't have a rock this big.

Permalänk
Medlem

Ifall du har pillat och ändrat i produktionsläge måste du starta om applikationen, för ActiveRecord cachar nämligen klasserna då.

Permalänk
Medlem

Jo jag vet, jag startar om mellan varje ändring, vilket inte direkt gör att saker går snabbare

Edit: Ok, lyckats få in den i development mode, nu får man iaf lite info!

Edit2:

{"commit"=>"Add loot", "loot"=>{"item_id"=>"56", "price"=>11.9, "character_id"=>"24", "mob_id"=>"3", "secondary"=>"no"}, "raid_id"=>"176"}

Verkar som att det är där det blir fel på något sätt

Visa signatur

Light travels faster than sound. Is that why some people appear to be smart before they speak?
It's a big rock. I can't wait to tell my friends. They don't have a rock this big.

Permalänk
Medlem

Hmm, nu när jag kollar närmare så sker felet i rad 18, där du gör ett anrop till superklassen. Har inte suttit med rails kod på ett bra tag så jag kan inte säga exakt vart det går fel, men kan du inte skriva koden så här och skita i konstruktorn? :

def price return item.secondary if secondary.eql? "yes" return item.default_price if @price.nil? return @price end def price=(value) @price = value end

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av kerberos

Edit2:

{"commit"=>"Add loot", "loot"=>{"item_id"=>"56", "price"=>11.9, "character_id"=>"24", "mob_id"=>"3", "secondary"=>"no"}, "raid_id"=>"176"}

Verkar som att det är där det blir fel på något sätt

Ett fel jag kan se är att kolumndefinitionen för secondary är en float, och du skickar in en sträng. Det kanske blir något fel då secondary sätts då, fast iofs hade jag isf väntat mig en TypeError.

Permalänk
Medlem

Har provat ändra den till en string men det ger ingen skillnad, kolumnen i sig i databasen är en float... skulle iofs kunna prova skicka 1 eller 0 istället.

Edit: nä, ingen skillnad där inte
Jag tror mest problemet är att secondary skickas med där över huvudtaget, den ska bara välja kolumn 4 (default_price) eller 5 (secondary) i databasen till price variabeln.

Visa signatur

Light travels faster than sound. Is that why some people appear to be smart before they speak?
It's a big rock. I can't wait to tell my friends. They don't have a rock this big.