Notes posted to Ruby on Rails
RSS feedArticle
Here is artice about this method http://blog.envylabs.com/post/75521798481/token-based-authentication-in-rails
Rendering JSONP
If you provide the :callback option with a nil value, then the default JSON object will be returned. As such, this makes creating JSONP response from the render syntax very easy in your controllers, like so:
render json: @object, callback: params[:jsoncallback]
Symbols more performant than strings
>> options_from_collection_for_select(@posts, :slug, :title, params[:slug])
Consider using symbols for performance, otherwise it will generate a string each time instead of a symbol which will reference the same object.
Storing array values
I tried to add a array value using hidden_field_tag and access it in jquery. It just returns the flattened version of array. eg:(If i try to store [1,[1,2,3]] in hidden_field_tag , in jquery iam just getting ‘1 1 2 3’) but if i use input field with type=hidden iam getting the correct value. Why is that?
onChange Event
Hello,
I’m brand new to ROR and in general server side programing. I’m a iOS developer who is trying to learn ROR.
I’m trying to use collection select to implement filtering for my page. The idea is there are a bunch of posts and I want to implement record filtering for those.
The first collection box would have parameters like “Date”, “Amount”, “Category” and based on the selection of this a secondary drop down would appear and allow the user to make a selection. The records on this page would be then filtered based on both the selection.
I have been trying out many things and have googled a lot on collection but I have reached a dead end now. I’m pretty new and just started learning ROR.
You help is much appreciated here.
Thanks in advance.
Note: the code below might be wrong and as of now its not even compiling.. currently it complaints of “remote_function” not defined…
I have a page that looks like this,
<div class=“span8”>
<% if @user.spendings.any? %> <h3> Spendings (<%= @user.spendings.count %>)</h3> <%= collection_select(:category, :category, Category.all, :id, :name, {:prompt => 'Select'})%> <%= collection_select :event, :filterType, Filters.all, :id, :filterType, {}, { :onchange => remote_function( :url => {:action => "updatelevel", :controller => "Spendings", :id => 1}, :with => "'level_id='+this.value" )}
%>
<ol class="spendings"> <%= render @spendings %> </ol> <%= will_paginate @spendings %> <% end %> </div>
An Example for using it.
Call it in a before filter in your Base or Application Controller.
before_filter :authenticate_through_api_client
def authenticate_through_api_client
# this block should return true or false authenticate_or_request_with_http_token |token,other_options| Apiclient.find_by_client_key(token).present? end
end
# Sample request type: it expects a token in headers as
Authorization:Token token=“your_token_goes_here”
Authorization is the key and Token token=“” is value
Placing it within stack at certain level
where_you_want_it = 0 (begining of stack loaded first) Rails.application.config.middleware.insert_before(where_you_want_it, Module::Class)
Update the uniqueness field when it value dependent on another existent field without uniqueness restriction.
I’m using sub-transaction to update existent records on DB. I use this approach to update the uniqueness field when it value dependent on another existent field without uniqueness restriction.
Migration for uniqueness with existent dependent data in DB
class AddUniquenessBarToFoo < ActiveRecord::Migration class Foo < ActiveRecord::Base end def change add_column :foos, :bar, :string execute "ALTER TABLE foos ADD CONSTRAINT uk_foods_bar UNIQUE (bar)" Foo.reset_column_information Foo.all.each do |f| begin #try get unique value in a new sub-transaction Foo.transaction(requires_new: true) do f.update_attributes!(:bar => "some ops. with another non-unique existent field to set this") end rescue ActiveRecord::StatementInvalid #We can't reuse a crashed transaction. New one. Foo.transaction(requires_new: true) do #Alternative unique value, if another error exist it's another #migration problem and then raise new error. f.update_attributes!(:bar => "some operation to set this-#{f.id}") end end end change_column :foos, :bar, :string, :null => false end end
Be aware about performance that is transaction per record for big DB.
Migration for uniqueness with existent data in DB
I’m using sub-transaction to update existent records on DB. I use this approach to update the uniqueness field when it value dependent on another existent field without uniqueness restriction.
Migration for uniqueness with existent dependent data in DB
class AddUniquenessBarToFoo < ActiveRecord::Migration class Foo < ActiveRecord::Base end def change add_column :foos, :bar, :string execute "ALTER TABLE foos ADD CONSTRAINT uk_foods_bar UNIQUE (bar)" Foo.reset_column_information Foo.all.each do |f| begin #try get unique value in a new sub-transaction Foo.transaction(requires_new: true) do f.update_attributes!(:bar => "some ops. with another non-unique existent field to set this") end rescue ActiveRecord::StatementInvalid #We can't reuse a crashed transaction. New one. Foo.transaction(requires_new: true) do #Alternative unique value, if another error exist it's another #migration problem and then raise new error. f.update_attributes!(:bar => "some operation to set this-#{f.id}") end end end change_column :foos, :bar, :string, :null => false end end
Be aware about performance that is transaction per record for big DB.
usage examples
For detailed usage examples of where see “Conditions” under ActiveRecord::Base.
Updated list of statuses
The list of supported statuses is now in the layout & rendering rails guide:
http://guides.rubyonrails.org/layouts_and_rendering.html#the-status-option
BEWARE of options[:value] in a partial
No problem with new records however,
the following line will not display the current @ecard value on EDIT but ‘contact@host.com’.
text_field :ecard, :sender, :value => 'contact@host.com'
Don’t let your views take control, but if you insist:
text_field :ecard, :sender, :value => f.object.ecard.blank? ? 'contact@host.com' : f.object.ecard
This doesn’t make sense, since when this object was created they deleted the default, which made it blank. Why would they want it back?
Take care with time ranges
Trying this in the console:
(1.day.from_now..5.days.from_now).overlaps?(5.days.from_now..10.days.from_now)
will blow up…
It’s fine with Dates though:
(1.day.from_now.to_date..5.days.from_now.to_date).overlaps?(5.days.from_now.to_date..10.days.from_now.to_date) # => true
Use `update_all` for Updating the Same Column for Multiple Records.
http://apidock.com/rails/ActiveRecord/Relation/update_all
Client.where( country: 'Canada' ).update_all( country_code: 'CA' )
submit button with rails javascript's onclick event handler method
Code example
<%= f.submit ‘Create User’, class: ‘buttons’, :onclick => “validate_user_form_and_submit()” %>
Correction
Where you see:
HelperData.new(datetime, options, html_options).select_hour
The correct would be:
HelperDate.new(datetime, options, html_options).select_hour
Class name and class instance must be same name.
Code works fine in Rails 3.2.13.
The "instance-level equivalent" ActiveRecord::Base#increment is NOT atomic
Typically, you want to increment counters atomically, so the class method ActiveRecord::Base.increment_counter is the right choice.
Also, there is an issue with the increment example below as it does not save automatically:
item = Item.find(1) item.foo_count # => 0 item.increment(:foo_count) item.foo_count # => 1 item.reload item.foo_count # => 0 item.increment(:foo_count) item.save item.reload item.foo_count # => 1
Found out you can't set the type to number
I am sure others have tried to do this but I thought I would add a not that tells ever one. You can’t use the type field in in rails 2.3. It is always set back to type => “text”
So if you are trying to set it to type => “number” it will not work. It always goes back to text. Sorry only way around this is to use a text_field_tag and set the type in that.
<%= text_field_tag :thing, type: "number" %>
Code above is the only way to set the type. in rails 3 you can just call number_field and it will work
Erb tags
The <% -%> is not being used since Rails 3.
The example above should be changed to:
<%= form_tag('/posts') do %> <div><%= submit_tag 'Save' %></div> <% end %>
Bug - this is not working as documented
The stacking of several after_commit lines is not working. The last line overwrites the ones before.
Using an array for the :on options is also not working.
For details look here: http://github.com/rails/rails/issues/988#issuecomment-12653474
Classy guys...
:fav_bra_size - really?
You have explain well
You have explain well about fragment caching as I was in need of this information. http://autobodycarparts.com
Statistics
Thanks for the coding part it was really helpful for me, I would apply it on my project. http://www.koolchart.com
Update multiple attributes with raw sql
You can update multiple attributes with sql for each record being updated by using the following syntax:
example
Model.update_all("foo = 'bar', baz = 'bat'")
Missing documentation for options hash
The deprecated function (http://apidock.com/rails/ActiveRecord/Serialization/to_json) has more useful documentation for the options hash.