When upload an image file with attachment_fu on windows, you will see there is an error such as 'Size is not included in the list' and you cannot upload the file to Amazon S3.
You can refer to the link "http://epirsch.blogspot.com/2008/01/fixing-attachmentfu-on-windows-like.html" to use attachment_fu_patch file but I cannot make it run because of lib path error.
Thus, I simply update the following three files and restart the server, which works great:
(1) %your_ruby_root%/lib/uby/1.8/tempfile.rb
def size
if @tmpfile
@tmpfile.fsync # added this line
@tmpfile.flush
@tmpfile.stat.size
else
0
end
end
(2)$your_project/vender/plugins/attachment/lib/technoweenie/attachment_fu.rb
def temp_data
if save_attachment?
f = File.new( temp_path )
f.binmode
return f.read
else
return nil
end
end
(3) $your_project/vender/plugins/attachment/lib/technoweenie/attachment_fu/backends/s3_backend.rb
def save_to_storage
if save_attachment?
S3Object.store(
full_filename,
(temp_path ? File.open(temp_path, "rb") : temp_data), # added , "rb"
bucket_name,
:content_type => content_type,
:access => attachment_options[:s3_access]
)
end
@old_filename = nil
true
end
Tuesday, April 13, 2010
Thursday, April 8, 2010
missing mislav-will_paginate
After you install 'will_paginate', you may see the strange error like:
Missing these required gems:
mislav-will_paginate
You're running:
ruby 1.8.7.72 at /usr/bin/ruby1.8
rubygems 1.3.5 at /home/ci/.gem/ruby/1.8, /usr/lib/ruby/gems/1.8
Run `rake gems:install` to install the missing gems.
And, even though you try to install 'mislav-will_paginate', it does not allow to install it.
Then, it is because you miss a source so that you need to add the following source as follows:
gem sources -a http://gems.github.com
Then, install:
gem install mislav-will_paginate
Missing these required gems:
mislav-will_paginate
You're running:
ruby 1.8.7.72 at /usr/bin/ruby1.8
rubygems 1.3.5 at /home/ci/.gem/ruby/1.8, /usr/lib/ruby/gems/1.8
Run `rake gems:install` to install the missing gems.
And, even though you try to install 'mislav-will_paginate', it does not allow to install it.
Then, it is because you miss a source so that you need to add the following source as follows:
gem sources -a http://gems.github.com
Then, install:
gem install mislav-will_paginate
Wednesday, March 31, 2010
Nested form with form_remote_tag
You may have a nested form for category within a root form as follows. And, you may use 'form_remote_tag' but if you click on the submit button for the nested form, it submits the root form.
%= start_form_tag :action => 'create' %>
div id="categories">
% form_remote_tag (:update => 'categories',
:url => { :action => 'add_category' }) do %>
%= text_field_tag 'new_price' %>
%= submit_tag 'Add' %>
% end %>
/div>
I have a solution even though it does not look pretty. You can just insert another form_remote_tag above the nested form:
%= start_form_tag :action => 'create' %>
%# faked form to avoid to submit the main form when addding review %>
% form_remote_tag(:url=>{:action =>'add_item'})do %>
% end %>
div id="categories">
% form_remote_tag (:update => 'categories',
:url => { :action => 'add_category' }) do %>
%= text_field_tag 'new_price' %>
%= submit_tag 'Add' %>
% end %>
/div>
% end_form_tag %>
%= start_form_tag :action => 'create' %>
div id="categories">
% form_remote_tag (:update => 'categories',
:url => { :action => 'add_category' }) do %>
%= text_field_tag 'new_price' %>
%= submit_tag 'Add' %>
% end %>
/div>
I have a solution even though it does not look pretty. You can just insert another form_remote_tag above the nested form:
%= start_form_tag :action => 'create' %>
%# faked form to avoid to submit the main form when addding review %>
% form_remote_tag(:url=>{:action =>'add_item'})do %>
% end %>
div id="categories">
% form_remote_tag (:update => 'categories',
:url => { :action => 'add_category' }) do %>
%= text_field_tag 'new_price' %>
%= submit_tag 'Add' %>
% end %>
/div>
% end_form_tag %>
Tuesday, March 23, 2010
error: Data truncated for column
We canot alter a nullable column when it is empty at MySQL.
Thus, if I want to change the column 'size_column' that are null to non-nu;;able colume, I got the following error:
== VerificationTries: migrating ==============================================
-- change_column(:associations, :size_column, :integer, {:limit=>3, :null=>false, :default=>0})
rake aborted!
An error has occurred, all later migrations canceled:
Mysql::Error: Data truncated for column 'size_column' at row 1: ALTER TABLE `associations` CHANGE 'size_column' 'size_column' mediumint DEFAULT 0 NOT NULL
Thus, if I want to change the column 'size_column' that are null to non-nu;;able colume, I got the following error:
== VerificationTries: migrating ==============================================
-- change_column(:associations, :size_column, :integer, {:limit=>3, :null=>false, :default=>0})
rake aborted!
An error has occurred, all later migrations canceled:
Mysql::Error: Data truncated for column 'size_column' at row 1: ALTER TABLE `associations` CHANGE 'size_column' 'size_column' mediumint DEFAULT 0 NOT NULL
Labels:
Data truncated for column,
db migration,
migration,
rails
Friday, March 5, 2010
rcov error on Windows
I have the following error at "rake test:coverage" at rcov 0.8.1.2 - I cannot install rcov-0.9.8:
0 tests, 0 assertions, 0 failures, 0 errors
c:/ruby-1.8.7-p72-i386-mswin32/lib/ruby/1.8/rexml/formatters/pretty.rb:131:in `[]': no implicit conversion from nil to integer (TypeError)
I've been lookin for the solution for this and I finally found one at "http://blog.andischacke.com/2009/03/problem-with-rcov-and-ruby-187.html".
I followed the step as he mentioned and it works now.
In summary, you need to change "lib/rcov/report.rb" of your rcov gem
if RUBY_VERSION == "1.8.6" && defined? REXML::Formatters::Transitive
into
if ["1.8.7", "1.8.6"].include?(RUBY_VERSION) && defined? REXML::Formatters::Transitive
Then, rerun
rake test:coverage
0 tests, 0 assertions, 0 failures, 0 errors
c:/ruby-1.8.7-p72-i386-mswin32/lib/ruby/1.8/rexml/formatters/pretty.rb:131:in `[]': no implicit conversion from nil to integer (TypeError)
I've been lookin for the solution for this and I finally found one at "http://blog.andischacke.com/2009/03/problem-with-rcov-and-ruby-187.html".
I followed the step as he mentioned and it works now.
In summary, you need to change "lib/rcov/report.rb" of your rcov gem
if RUBY_VERSION == "1.8.6" && defined? REXML::Formatters::Transitive
into
if ["1.8.7", "1.8.6"].include?(RUBY_VERSION) && defined? REXML::Formatters::Transitive
Then, rerun
rake test:coverage
Monday, March 1, 2010
ThinkingSphinx GetLastError in Windows
I have the following error when I start or stop or restart the sphinx server after Iaccidentally restarted windows while sphinx was runnung:
WARNING: could not open pipe (GetLastError()=2)
FATAL: stop: error terminating pid 24256
Then, look up sphinx_conf.pid file and delete the file to remove pid 24256. That is, I have a log file named "searchd.development.pid" under "rails_project/log". The pid file has "24256". Thus, I deleted the file and "rake ts:start" and works well.
WARNING: could not open pipe (GetLastError()=2)
FATAL: stop: error terminating pid 24256
Then, look up sphinx_conf.pid file and delete the file to remove pid 24256. That is, I have a log file named "searchd.development.pid" under "rails_project/log". The pid file has "24256". Thus, I deleted the file and "rake ts:start" and works well.
Labels:
error,
getlasterror,
rails,
sphinx,
thinking sphinx
Thursday, February 25, 2010
rails commands for gem unpack
If you want to unpack gem file - you can only unpack gems that you have installed, for example memcache-client:
gem unpack memcache-client
You may also use rake:
rake gems:unpack GEM=memcache-client
But some reason, the second does not work for my msysgit.
And, there is a discussion to use gem or plugin (http://www.robbyonrails.com/articles/2009/01/13/question-plugins-or-gems-or-both)
gem unpack memcache-client
You may also use rake:
rake gems:unpack GEM=memcache-client
But some reason, the second does not work for my msysgit.
And, there is a discussion to use gem or plugin (http://www.robbyonrails.com/articles/2009/01/13/question-plugins-or-gems-or-both)
rails commands for db dataset load and add
If you have db/dataset and db/dataset/dev folders that contain yml files, you can upload yml data to your db as follows:
rake db:dataset:load
However, if you load dev data with the following command, it nukes the db data from the previous command:
rake db:dataset:load DATASET=dev
Thus, you can run the following command to add dev data without nuking the existing data:
rake db:dataset:add DATASET=dev
Or if you have dev data first and wants to load db/dataset without nuking db/dataset/dev, you need to run the following:
rake db:dataset:add DATASET=.
rake db:dataset:load
However, if you load dev data with the following command, it nukes the db data from the previous command:
rake db:dataset:load DATASET=dev
Thus, you can run the following command to add dev data without nuking the existing data:
rake db:dataset:add DATASET=dev
Or if you have dev data first and wants to load db/dataset without nuking db/dataset/dev, you need to run the following:
rake db:dataset:add DATASET=.
Labels:
dataset,
db:dataset:add,
db:dataset:load,
rails,
yml
Monday, February 22, 2010
Rails plugins and gems
In each rails project, there is a folder named gems and plugins. They are lib files needed for the project. You can install a gem or a plugin into plugins folder. For example, if you want to install will-paginate, you can run the following in the command prompt windows. Then, your rails will recognize the gem:
$ gem install will_paginate
Successfully installed will_paginate-2.3.12
1 gem installed
Installing ri documentation for will_paginate-2.3.12...
Installing RDoc documentation for will_paginate-2.3.12...
However, when you share this lib of the project with others, others need to install the gem. But, if you put the lib into your project, others do not need to install the gem. Therefore, since rails 2.1, you can put the lib into the plugins folder with the follwing command:
$ ./script/plugin install git://github.com/mislav/will_paginate.git
Then, you can find the lib folder as follows: your_project/Vendor/plugins/will_paginate
$ gem install will_paginate
Successfully installed will_paginate-2.3.12
1 gem installed
Installing ri documentation for will_paginate-2.3.12...
Installing RDoc documentation for will_paginate-2.3.12...
However, when you share this lib of the project with others, others need to install the gem. But, if you put the lib into your project, others do not need to install the gem. Therefore, since rails 2.1, you can put the lib into the plugins folder with the follwing command:
$ ./script/plugin install git://github.com/mislav/will_paginate.git
Then, you can find the lib folder as follows: your_project/Vendor/plugins/will_paginate
Labels:
gem,
gem and plugin,
gem vs plugin,
install plugin,
plugin,
rails
Friday, February 19, 2010
rails polymorphic association
You can implement polymorphic associaton among tables COMMENTS, ARTICLES, PHOTOS as follows:
class Comment < ActiveRecord::Base
belongs_to :commentable, :polymorphic => true
end
class Article < ActiveRecord::Base
has_many :comments, :as => :commentable
end
class Photo < ActiveRecord::Base
has_many :comments, :as => :commentable
end
Then, you need the following statements in order to invoke article with comments:
# in model Article, collect article that has many comments
@article = Article.find(id)
@article_with_comments = @article.comments
Besides, you can also use the following statement to
@article = "articles".classify.constantize.find(id)
class Comment < ActiveRecord::Base
belongs_to :commentable, :polymorphic => true
end
class Article < ActiveRecord::Base
has_many :comments, :as => :commentable
end
class Photo < ActiveRecord::Base
has_many :comments, :as => :commentable
end
Then, you need the following statements in order to invoke article with comments:
# in model Article, collect article that has many comments
@article = Article.find(id)
@article_with_comments = @article.comments
Besides, you can also use the following statement to
@article = "articles".classify.constantize.find(id)
how to install plugin in rails project
You need to install plugins into your project. It is very simple once you know it. If you have the following error, it is because you don't have a plugin "acts_as_tree".
Error message:
undefined method `acts_as_tree' for #
In your model:
class Post < ActiveRecord::Base
acts_as_tree :order => "name"
end
In the command line windows/termial of your project directory, you can run the followin command:
./script/plugin install acts_as_tree
That is it. Now you don't see the error. And you should have "Vendor\plugins\acts_as_tree"
Error message:
undefined method `acts_as_tree' for #
In your model:
class Post < ActiveRecord::Base
acts_as_tree :order => "name"
end
In the command line windows/termial of your project directory, you can run the followin command:
./script/plugin install acts_as_tree
That is it. Now you don't see the error. And you should have "Vendor\plugins\acts_as_tree"
Thursday, February 11, 2010
ThinkingSphinx Basic command
1. Create a cofiguration file as config/development.sphinx.conf:
run rake ts:config
2. Indexin data:
run rake ts:in
or
run rake ts:index
3. Run ThinkingSphinx server daemon:
run rake ts:daemon:start
or not as a daemon
run rake ts:start
run rake ts:config
2. Indexin data:
run rake ts:in
or
run rake ts:index
3. Run ThinkingSphinx server daemon:
run rake ts:daemon:start
or not as a daemon
run rake ts:start
Labels:
config,
daemon,
rails,
search engine,
sphinx,
thinking sphinx
Saturday, February 6, 2010
session ActiveRecord in Rails
If your ActiveRecord session does not work but keeps generating session object in your sessions table, there is a possibility that you have changed the name of session "_session_session" to something else at Configuration/initializers/session_store.rb
Labels:
ActiveRecord,
memcached,
rails,
session,
sessions table
Friday, February 5, 2010
memcached in rails on Mac and Windows 7
Rails use the following caching methods:
Page Caching
Action Caching
Fragment Caching
Sweepers
SQL Caching
Page caching is to cache a full page in a controller logic. It ignores parameters and good for stateless page not for stateful page that we used to have. Page caches are always stored on disk.
Action caching is to cache a full action response in a controller logic. Before caching, we can add before_filter in order to add more functions such as authentication.
Fragment Caching is to cache a part of a page in a view logic. It does not dramatically improve performance as Page and Action cachings do. It is implemented with Action caching.
You need to insert expire_{page,action,fragment} calls normally in create, update, and destroy actions in order to delete caches. However, Cache sweeping (Sweepers) is an automatic mechanism which allows you to get around having a ton of expire_{page,action,fragment} calls in your code. Sweeper needs an "observe" that observes a model to be changed. Once you have a sweeper class, the sweeper has to be added to the controller that will use it.
Query caching is a Rails feature that caches the result set returned by each query. If Rails encounters the same query again during the current request, it will used the cached result set as opposed to running the query against the database.
Cache Stores
Caching data is stored at disk, memory, and DB.
1. ActiveSupport::Cache::MemoryStore: A cache store implementation which stores everything into memory in the same process.
2. ActiveSupport::Cache::FileStore: Cached data is stored on the disk. This is the default store and the default path for this store is: /tmp/cache.
3. ActiveSupport::Cache::DRbStore: Cached data is stored in a separate shared DRb process that all servers communicate with.
4. MemCached store: Works like DRbStore, but uses Danga's MemCache instead. Rails uses the bundled memcached-client gem by default. This is currently the most popular cache store for production websites. It also needs to run memcached server. We will use MemCached store here.
5. ActiveSupport::Cache::SynchronizedMemoryStore: Like ActiveSupport::Cache::MemoryStore but thread-safe.
6. ActiveSupport::Cache::CompressedMemCacheStore: Works just like the regular MemCacheStore but uses GZip to decompress/compress on read/write
7. Custom store: You can define your own cache store
We are using #4 MemCached store for both session and cache. In order to use it, memcached server should be run separately with rails server. In order to install memcached, you need to follow as:
MAC [4]
sudo port install memcached
Once you have memcache you'll want to start it running:
memcached -vv
The -vv puts memcache in Very Verbose mode so you get to see all the action. You'll run this as a daemon once you're ready to go for real (replace -vv with -d).
For Ruby we're using memcache-client and you'll need the gem:
sudo gem install memcache-client
Windows [5, 6]
1. Install MemCached (http://www.danga.com/memcached/). For windows download binaries and manually install. It is well explained in the site.
2. Install Memcached-Client
# gem install memcache-client
3. Start the memcached Server. It says Start the server from the Microsoft Management Console or by running the following command:
'c:\memcached\memcached.exe -d start'
However, it did not work on my Windows 7. You can go to the folder of memcached installed and just double-click on "memcached.exe" at window explorer. It'll run in port 11211. Besides, in the command prompt window, for example, at c:\memcached, you can type in
memcached -vv -P /tmp/memcached.pid
It will display cache object.
References
1. http://guides.rubyonrails.org/caching_with_rails.html
2. http://townx.org/rails_and_memcached
3. http://nubyonrails.com/articles/memcached-basics-for-rails
4. http://www.ridingtheclutch.com/2009/01/08/cache-anything-easily-with-rails-and-memcached.html
5. http://ratnaonrails.wordpress.com/2008/07/17/memcached-in-rails/
6. http://www.splinedancer.com/memcached-win32/
Page Caching
Action Caching
Fragment Caching
Sweepers
SQL Caching
Page caching is to cache a full page in a controller logic. It ignores parameters and good for stateless page not for stateful page that we used to have. Page caches are always stored on disk.
Action caching is to cache a full action response in a controller logic. Before caching, we can add before_filter in order to add more functions such as authentication.
Fragment Caching is to cache a part of a page in a view logic. It does not dramatically improve performance as Page and Action cachings do. It is implemented with Action caching.
You need to insert expire_{page,action,fragment} calls normally in create, update, and destroy actions in order to delete caches. However, Cache sweeping (Sweepers) is an automatic mechanism which allows you to get around having a ton of expire_{page,action,fragment} calls in your code. Sweeper needs an "observe" that observes a model to be changed. Once you have a sweeper class, the sweeper has to be added to the controller that will use it.
Query caching is a Rails feature that caches the result set returned by each query. If Rails encounters the same query again during the current request, it will used the cached result set as opposed to running the query against the database.
Cache Stores
Caching data is stored at disk, memory, and DB.
1. ActiveSupport::Cache::MemoryStore: A cache store implementation which stores everything into memory in the same process.
2. ActiveSupport::Cache::FileStore: Cached data is stored on the disk. This is the default store and the default path for this store is: /tmp/cache.
3. ActiveSupport::Cache::DRbStore: Cached data is stored in a separate shared DRb process that all servers communicate with.
4. MemCached store: Works like DRbStore, but uses Danga's MemCache instead. Rails uses the bundled memcached-client gem by default. This is currently the most popular cache store for production websites. It also needs to run memcached server. We will use MemCached store here.
5. ActiveSupport::Cache::SynchronizedMemoryStore: Like ActiveSupport::Cache::MemoryStore but thread-safe.
6. ActiveSupport::Cache::CompressedMemCacheStore: Works just like the regular MemCacheStore but uses GZip to decompress/compress on read/write
7. Custom store: You can define your own cache store
We are using #4 MemCached store for both session and cache. In order to use it, memcached server should be run separately with rails server. In order to install memcached, you need to follow as:
MAC [4]
sudo port install memcached
Once you have memcache you'll want to start it running:
memcached -vv
The -vv puts memcache in Very Verbose mode so you get to see all the action. You'll run this as a daemon once you're ready to go for real (replace -vv with -d).
For Ruby we're using memcache-client and you'll need the gem:
sudo gem install memcache-client
Windows [5, 6]
1. Install MemCached (http://www.danga.com/memcached/). For windows download binaries and manually install. It is well explained in the site.
2. Install Memcached-Client
# gem install memcache-client
3. Start the memcached Server. It says Start the server from the Microsoft Management Console or by running the following command:
'c:\memcached\memcached.exe -d start'
However, it did not work on my Windows 7. You can go to the folder of memcached installed and just double-click on "memcached.exe" at window explorer. It'll run in port 11211. Besides, in the command prompt window, for example, at c:\memcached, you can type in
memcached -vv -P /tmp/memcached.pid
It will display cache object.
References
1. http://guides.rubyonrails.org/caching_with_rails.html
2. http://townx.org/rails_and_memcached
3. http://nubyonrails.com/articles/memcached-basics-for-rails
4. http://www.ridingtheclutch.com/2009/01/08/cache-anything-easily-with-rails-and-memcached.html
5. http://ratnaonrails.wordpress.com/2008/07/17/memcached-in-rails/
6. http://www.splinedancer.com/memcached-win32/
Subscribe to:
Posts (Atom)