Activity
Posted in Use datatables like handsontable
Hi,
I would love to see a episode that explains the use of json/ajax and load and save back data back to the server. For example i want to use handsontable (http://handsontable.com/) but i cant load (and save) data to it.
HI,
i am running into a problem with the solution i implemented. this only works when dealing with whole numbers.
I have a WarehouseStock model and when i take items from stock it will set it to used and set the ledger where it was used for.
Now when we have item where the unit is in meters and we receive 6.5 meters how can i take a half item when i store each item individually.
Thanks for thinking along Chris!
I will store each item individually, i thought this was wrong because when i get 200 screws it makes 200 records, I can however group by PurchaseOrder number and sum the total of the product to keep the views clear.
Also when i store each item individually it is easy to do a return booking i can find the the items and do set used to false and update the cost center to warehouse stock and it is returned.
Hi,
I am looking for this:
for a warehouse application for ordering and keeping stock for machine maintenance .
i have multiple record of items that coming in.
On Monday i received a item 5 times for 1€ and on Wednesday i receive the same item for 1.50€ 3 times.
So now i have multiple lines of a product received.
now the mechanic takes out 6 of the item and i want to add budget cost of 6.50 to a machine. this is based on the first in first out principle.
so how can i rotate to the lines that still have items in it and subtract that to zero and go to next line.
I did write down something like this but it looks awful, is this something that could work or do i need a different approach.
def find_item(item, took_from_stock)
item = #find the linetems which has stock sorted on date
set_stock(item, took_from_stock)
end
def set_stock(item, took_from_stock)
item = item
x = took_from_stock
x.times do
item.stock - 1
x - 1
unless
item.stock == 0
else
find_next_item(item, x)
end
end
end
def find_next_item(item , x)
if x == 0
item_complete
else
item = #find the linetems which has stock sorted on date
set_stock(item, took_from_stock)
end
end
def item_complete
# do some stuff
end
Posted in AASM state based on variable
Hi Chris,
first of all, thank you for this great site! i love the videos and they are really helping me forward.
about my question, it looks kind of ugly but it works so i will leave it like this.
i found a solution for my naming problem.
instead of aasm_state you can call aasm.human_state and the text will be without the _
you can also use the .yml files to change the entire name i did not get that to work yet :)
Posted in AASM state based on variable
Hi,
I am using AASM and i want to set the state based on the total_price of a purchase order.
is this code below the way to go or can it be refactored.
before_save :check_budget
event :over_budget do
transitions from: [:new, :new_approval_needed], to: :new_approval_needed
end
event :on_budget do
transitions from: [:new, :new_approval_needed], to: :new
end
end
def check_budget
if aasm_state = 'new' || 'new_approval_needed'
if total_price > 500
over_budget
else
on_budget
end
else
end
end
Also, is it possible to set custom state names without the _ because it looks ugly on the PO if the state is NEW_APPROVAL_NEEDED i would like it to be NEW APPROVAL NEEDED
And use the master branch or you will get undefined methods errors. (this step is not included in the readme)
gem 'refile', require: "refile/rails", git: 'https://github.com/refile/refile.git', branch: 'master'
Hi,
If you want to tackle the problem Andrew described: You don’t want someone manually typing http://yourapp.com/client/3 into their browser.
you can do the following using Pundit and using a association model:
class User < ActiveRecord::Base
has_many :associations
has_many :clients, through: :associations
end
class Association < ActiveRecord::Base
belongs_to :user
belongs_to :client
end
class Item < ActiveRecord::Base
has_many :associations
has_many :users, through: :associations
end
and your client_policy.rb will look like this:
class ClientPolicy < ApplicationPolicy
def initialize(user, client)
@user = user
@client = client
end
class Scope < Scope
def resolve
if user.admin?
scope.all
else
scope.where(:id => user.associations.pluck(:client_id))
end
end
end
def index?
user.present?
end
def show?
user.present? && @user.associations.pluck(:client_id).include?(@client.id)
end
def create?
user.present? && user.admin?
end
def new?
create?
end
def update?
user.present? && @user.associations.pluck(:client_id).include?(@client.id)
end
def edit?
update?
end
def destroy?
user.present? && user.admin?
end
end
This way you will only be allowed to clients where you have access to.
Posted in Handle money in Rails
Hi,
What do you think is the best way to handle money in rails?
At the moment i use a decimal field with a precision if 16 and a scale of 2.
the problem is that we use the comma as a decimal sign and this sometimes becomes a problem.
should i use the money gem or use only cents or do you guys have a better way to handle this?
when you set the config.time_zone
the time will be saved as UTC.
When i set config.time_zone = 'Europe/Amsterdam'
the SQL sets the time in UTC
SQL (0.3ms) UPDATE "assignments" SET "send_on" = $1, "status" = $2, "token" = $3, "updated_at" = $4 WHERE "assignments"."id" = 18 [["send_on", "2015-05-07 07:49:36.908033"], ["status", "send"], ["token", "72BKmqs-aYVC56wLTmM4lgiajqrsb7YvMHDzeM-zN9lw"], ["updated_at", "2015-05-07 07:49:36.908870"]]
When i call ruby <%= @assignment.send_on %>
in the view i get 2015-05-07 09:49:36 +0200
When i set config.time_zone = 'Eastern Time (US & Canada)'
restart the server i get 2015-05-07 03:49:36 -0400
Hi Chris,
Thank you! that did the trick!
when i was looking for a answer why to use Time.zone.now
instead of DateTime.now
i found an explanation on the following site:
http://winstonyw.com/2014/03/03/time_now_vs_time_zone_now/
is it a correct assumption that all times are stored in UTC format in the database and when you call the time from the database the time is set based on the timezone set in the application.rb?
Hi,
I have a strange problem
When i do the following method with no config.time_zone set in the application.rb it works.
def send_assignment
@assignment = Assignment.find(params[:id])
@assignment.update_attributes( :status => "send", :send_on => DateTime.now )
AssignmentMailer.send_assignment(@assignment).deliver
redirect_to @assignment, notice: Send'
end
When i set the config.time_zone to
config.time_zone = 'Amsterdam'
i get the following error when i call the method
SystemStackError - stack level too deep:
actionpack (4.1.5) lib/action_dispatch/middleware/reloader.rb:79:in `'
If i remove the ruby :send_on => DateTime.now
from the method i works.
So the DateTime.now causes a stack error when i set the config.time_zone.
Suggestions?
Posted in Render \r\n in javascript.erb
I actually needed the \r\n
because when you add .val with jquery on a text field it uses that to put the new lines in the right place.
so when you use simple_format
you get the <br/>
as text in your field.
Your answer was still great because
$("#assignment_conditions").val("<%=j @company.conditions %>");
did the trick!
Posted in Render \r\n in javascript.erb
HI,
I try to add the value of a text field in a form from a other database field.
I use the following javascript
$("#assignment_conditions").empty();
$("#assignment_conditions").val("<%= @company.conditions%>");
this however fills in
$("#assignment_conditions").empty();
$("#assignment_conditions").val("Op deze opdracht zijn de volgende voorwaarden en condities van toepassing in volgorde van
belangrijkheid:
----
De hierboven vermelde documenten zijn in het verleden eerder verstrekt aan opdrachtnemer en
vormen de basis voor het komen tot een service- en onderhoudsovereenkomst tussen opdrachtgever en
opdrachtnemer");
i need this
$("#assignment_conditions").empty();
$("#assignment_conditions").val("Op deze opdracht zijn de volgende voorwaarden en condities van toepassing in volgorde van\r\nbelangrijkheid:\r\n\r\n----\r\n\r\nDe hierboven vermelde documenten zijn in het verleden eerder verstrekt aan opdrachtnemer en\r\nvormen de basis voor het komen tot een service- en onderhoudsovereenkomst tussen opdrachtgever en\r\nopdrachtnemer.");
when i use @company.conditions.to_json it works because to output is like this
$("#assignment_conditions").empty();
$("#assignment_conditions").val("Op deze opdracht zijn de volgende voorwaarden en condities van toepassing in volgorde van\r\nbelangrijkheid:\r\n\r\n----\r\n\r\nDe hierboven vermelde documenten zijn in het verleden eerder verstrekt aan opdrachtnemer en\r\nvormen de basis voor het komen tot een service- en onderhoudsovereenkomst tussen opdrachtgever en\r\nopdrachtnemer");
This adds " so this is not ideally. i tried to_html and gsub but i don't get the right result. Any suggestions?
After a airpair session i got it to work.
We used a lot of methods because you can call them in the console when you use the byebug gem.
but we did it the way you suggested!
class DetailAction < ActiveRecord::Base
belongs_to :item_detail
has_many :detail_action_amounts ,dependent: :destroy
has_many :budget_items ,dependent: :destroy
accepts_nested_attributes_for :detail_action_amounts, :reject_if => :all_blank, :allow_destroy => true
before_create :set_default, on: :create
before_save :set_sum
after_save :recalculate_overridden_actions
def set_default
item_detail = ItemDetail.where(:id => self.item_detail_id)
item = Item.where(:id => item_detail[0].item_id)
self.starting_year = item[0].construction_date + self.condition_three
self.amount = '1' unless self.amount
self.cycle = self.condition_three
end
def set_sum
if self.cycle?
self.sum = self.amount * self.norm
self.sequence = calculate_sequence
else
self.sum = self.amount * self.norm
end
end
def recalculate_overridden_actions
overridden_actions.each(&:set_sum).each(&:save)
end
def calculate_sequence
basic_sequence - overriding_sequences.flatten
end
def basic_sequence
starting_year.step(starting_year + 500, step = cycle ).to_a
end
def overriding_sequences
overriding_actions.map(&:basic_sequence)
end
def overriding_actions
item_detail.detail_actions.to_a.select do |action|
self.is_overridden_by?(action)
end
end
def overridden_actions
item_detail.detail_actions.to_a.select do |action|
action.is_overridden_by?(self)
end
end
def is_overridden_by?(other_action)
other_action.hierarchy < hierarchy &&
other_action.hierarchy.first == hierarchy.first
end
end
I'm working on a maintenance planning/cost application. With the help of gorails, onemonth, codeschool and all other great resources I am almost ready to launch the first release. However I can really use some help for the last part.
I have a items model where I store the item information. An item can be a building, factory, swimming pool or even a single machine or room. A item has many ItemDetails and a ItemDetail has many DetailActions.
For Example:
We have a Item :
Building A
Item “Building A” has a ItemDetail:
electric water heater 80 liter:
ItemDetail “electric water heater 80 liter” has the following DetailActions:
electric water heater (replace)
electric water heater (maintenance)
heat distributor (replace)
heat distributor (maintenance)
The DetailActions model looks like this:
id :integer not null, primary key
name :text
unit :string(255)
starting_year :integer
hierarchy :string(255)
norm :decimal(14, 2)
condition_one :integer
condition_two :integer
condition_three :integer
condition_four :integer
condition_five :integer
item_detail_id :integer
created_at :datetime
updated_at :datetime
amount :decimal(16, 2)
sum :decimal(16, 2)
cycle :integer
sequence :string(255) default([]), is an Array
when an item is created the model calculates the sum and it sets the sequence and that's where I need some help.
Currently the sequence is set like this in the detailaction model:
self.sequence = self.starting_year.step(self.starting_year + 500, step = self.cycle ).to_a
this gives something like the following:
["2026", "2036", "2046", "2056", "2066", "2076", "2086", "2096", "2106", "2116", "2126", "2136", "2146", "2156", "2166", "2176", "2186", "2196", "2206", "2216", "2226", "2236", "2246", "2256", "2266", "2276", "2286", "2296", "2306", "2316", "2326", "2336", "2346", "2356", "2366", "2376", "2386", "2396", "2406", "2416", "2426", "2436", "2446", "2456", "2466", "2476", "2486", "2496", "2506", "2516", "2526"]
as you can imagine you wont need to do any maintaince to the heat distributor when we replace the heat distributor that year. So thats where the hierarchy comes in. in the example the hierarchy would be like this:
electric water heater (replace) 101
electric water heater (maintenance) 102
heat distributor (replace) 201
heat distributor (maintenance) 202
so when the electric water heater gets replaced in for example 2036 we would not like to do any maintenance.
I would like to achieve this to set the sequence based on the hierarchy.
In the console I can do (for example) take the id's the heat distributor
replace = DetailAction.find(5598)
maintenance = DetailAction.find(5599)
replace.sequence
=> ["2036", "2061", "2086", "2111", "2136", "2161", "2186", "2211", "2236", "2261", "2286", "2311", "2336", "2361", "2386", "2411", "2436", "2461", "2486", "2511", "2536"]
maintenance.sequence
=> ["2013", "2014", "2015", "2016", "2017", "2018", "2019", "2020", "2021", "2022", "2023", "2024", "2025", "2026", "2027", "2028", "2029", "2030", "2031", "2032", "2033", "2034", "2035", "2036", "2037", "2038", "2039", "2040", "2041", "2042", "2043", "2044", "2045", "2046", "2047", "2048", "2049", "2050", "2051", "2052", "2053", "2054", "2055", "2056", "2057", "2058", "2059", "2060", "2061", "2062", "2063", …...............................]
and simple do new_maintenance_sequence
= maintenance.sequence
- replace.sequence
new_maintenance_sequence = maintenance.sequence - replace.sequence
=> ["2013", "2014", "2015", "2016", "2017", "2018", "2019", "2020", "2021", "2022", "2023", "2024", "2025", "2026", "2027", "2028", "2029", "2030", "2031", "2032", "2033", "2034", "2035", "2037", "2038", "2039", "2040", "2041", "2042", "2043", "2044", "2045", "2046", "2047", "2048", "2049", "2050", "2051", "2052", "2053", "2054", "2055", "2056", "2057", "2058", "2059", "2060", "2062", "2063", "….............................]
I am stuck how to implement this in the model. I would like to loop trough all the DetailActions that belong to the ItemDetail to set the sequence
so when the hierarchy is:
a = 101
b = 102
c = 103
d = 201
e = 202
the sequence get set like:
c = c – b + a
b = b = b- a
a = a
e = e – d
d = d
Do you guys can get me on the right track or is the path i chose wrong?
My current detail action model looks like this:
class DetailAction < ActiveRecord::Base
belongs_to :item_detail
has_many :detail_action_amounts ,dependent: :destroy
has_many :budget_items ,dependent: :destroy
accepts_nested_attributes_for :detail_action_amounts, :reject_if => :all_blank, :allow_destroy => true
before_create :set_default
before_save :set_sum
def set_default
item_detail = ItemDetail.where(:id => self.item_detail_id)
item = Item.where(:id => item_detail[0].item_id)
self.starting_year = item[0].construction_date + self.condition_three
self.amount = '1' unless self.amount
self.cycle = self.condition_three
self.sum = self.amount * self.norm
self.sequence = self.starting_year.step(self.starting_year + 500, step = self.cycle ).to_a
end
def set_sum
if self.cycle?
self.sum = self.amount * self.norm
self.cycle = self.condition_three unless self.cycle
self.sequence = self.starting_year.step(self.starting_year + 500, step = self.cycle ).to_a
else
self.sum = self.amount * self.norm
end
end
end
Posted in field_for with index
I have a form that uses java script and the data-attribute to do some calculations (Calx2).
to make the data-attributes unique i use the the index method that is available.
<tbody id="detail_list">
<%= f.fields_for :detail_action_amounts, remote:true, :wrapper => false do |detail_action_amount| %>
<tr class="fields">
<td><%= detail_action_amount.text_field :description %></td>
<td><%= detail_action_amount.text_field :amount :data => { :cell=> "A#{detail_action_amount.index}"} %></td>
<td><%= detail_action_amount.text_field :factor :data => { :cell=> "B#{detail_action_amount.index}"} %></td>
<td><%= detail_action_amount.text_field :length :data => { :cell=> "C#{detail_action_amount.index}"} %></td>
<td><%= detail_action_amount.text_field :width, :data => { :cell=> "D#{detail_action_amount.index}"} %></td>
<td><%= detail_action_amount.text_field :height :data => { :cell=> "E#{detail_action_amount.index}"} %></td>
<td><%= detail_action_amount.text_field :total :data => { :cell=> "F#{detail_action_amount.index}", :formula=> "A#{detail_action_amount.index}*(C#{detail_action_amount.index}*D#{detail_action_amount.index}*E#{detail_action_amount.index})/100*B#{detail_action_amount.index}"} %></td>
<td><%= detail_action_amount.link_to_remove "Verwijder", :class => "btn btn-outline btn-red btn-smal btn-remove" %></td>
</tr>
<% end %>
</tbody>
<tfoot>
<tr>
<td colspan="6">Totaal</td>
<td><%= f.text_field :amount, class: 'labelsize50', :data => { :cell=> "G1", :formula=> "SUM(F0:F1000)"} %></td>
<td colspan="2"></td>
</tr>
</tfoot>
</table>
This all works but when i add a field the index method adds the time in milliseconds instead of a ascending number.
is there a good and simple way to use a ascending number?
Posted in Capistrano deployment errors
Hi,
Thanks Chris! i got it working again. i checked my capfile and i forget to add
require 'capistrano/rbenv'
after i added this to my capfile i was getting
DEBUG[7cacbd08] Running /usr/bin/env [ ! -d /usr/local/rbenv/versions/2.1.5p273 ] on
DEBUG[7cacbd08] Command: [ ! -d /usr/local/rbenv/versions/2.1.5p273 ]
DEBUG[7cacbd08] Finished in 0.587 seconds with exit status 0 (successful).
ERRORrbenv: 2.1.5p273 is not installed or not found in /usr/local/rbenv/versions/2.1.5p273
cap aborted!
So i looked in ~/.rbenv/versions$ and noticed the folder was named 2.1.5. so edited my capfile again from:
:rbenv_ruby, '2.1.5p273'
to
:rbenv_ruby, '2.1.5'
run deploy again and it all works now.
still have to run db:migrations and bundle manually so that is my next challange.
Posted in Capistrano deployment errors
Yes, i did have the same versions locally and on my server i installed 2.1.5 now on both machines and i still get the same error.
I tried to install the gem on my production server in the current folder and the gem will install.
even if i go to my releasees folder and go to the latest uploaded release and run bundle the working gem will be installed.
Installing working_hours 1.0.2
Your bundle is complete!
Gems in the groups development and test were not installed.
It was installed into /home/deploy/btapp/shared/bundle
deploy@BTAPP:~/btapp/releases/20141210085038$
Posted in Capistrano deployment errors
Hi,
I installed the working_hours gem to calculate SLA hours on my ticketsystem. It all works on dev so i was ready to deploy it to the production machine with capistrano
now i get the following errors when i run cap deploy:
DEBUG[be1a04f1] rake aborted!
DEBUG[be1a04f1] SyntaxError: /home/deploy/btapp/shared/bundle/ruby/1.9.1/gems/working_hours-1.0.2/lib/working_hours/computation.rb:7: syntax error, unexpected tLABEL
DEBUG[be1a04f1] def add_days origin, days, config: nil
DEBUG[be1a04f1] ^
DEBUG[be1a04f1] /home/deploy/btapp/shared/bundle/ruby/1.9.1/gems/working_hours-1.0.2/lib/working_hours/computation.rb:21: syntax error, unexpected tLABEL
DEBUG[be1a04f1] def add_hours origin, hours, config: nil
DEBUG[be1a04f1] ^
DEBUG[be1a04f1] /home/deploy/btapp/shared/bundle/ruby/1.9.1/gems/working_hours-1.0.2/lib/working_hours/computation.rb:26: syntax error, unexpected tLABEL
DEBUG[be1a04f1] def add_minutes origin, minutes, config: nil
i am on ruby 2.1.2 and when i run rbenv versions i dont see 1.9.1 is that normal?
i tried different gem version of working_hours but i still get the same errors,
Any ideas?