<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8360991241158352605</id><updated>2011-04-22T13:23:27.017+08:00</updated><category term='ruby'/><category term='rest'/><category term='module desgin'/><category term='route'/><category term='Parameterized'/><category term='bug'/><category term='solidworks'/><category term='rails'/><category term='restful'/><title type='text'>Aaron's Blog</title><subtitle type='html'>Devoting for Ruby, Rails and Web development</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://aaron2ti.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8360991241158352605/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://aaron2ti.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Aaron</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>5</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8360991241158352605.post-8768999303952370371</id><published>2008-06-18T13:23:00.017+08:00</published><updated>2008-06-18T13:56:26.123+08:00</updated><title type='text'>Plugin released - records_sequence</title><content type='html'>In my last &lt;a href="http://aaron2ti.blogspot.com/2008/06/test-code-highlight.html"&gt;post&lt;/a&gt;, I wanted to have some &lt;span class="Apple-style-span"  style="color: rgb(34, 34, 34);  line-height: 24px; font-family:'Helvetica Neue';"&gt;flexible next or previous functions to find a object's neighbors. To fulfill that I just finished a plugin called "&lt;span class="Apple-style-span"  style="line-height: normal; white-space: pre; font-family:'Lucida Grande';"&gt;&lt;a href="http://github.com/Aaron2Ti/records_sequence/tree/master"&gt;&lt;span class="Apple-style-span"  style="color:#000000;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;records_sequence&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;" which could be found &lt;a href="http://github.com/Aaron2Ti/records_sequence/tree/master"&gt;here&lt;/a&gt;.&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;/span&gt;&lt;span class="Apple-style-span"   style="font-family:'Helvetica Neue';color:#222222;"&gt;&lt;span class="Apple-style-span" style="line-height: 24px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;/span&gt;&lt;span class="Apple-style-span"   style="font-family:'Helvetica Neue';color:#222222;"&gt;&lt;span class="Apple-style-span" style="line-height: 24px;"&gt;After installed, records_sequence could mixin two methods "next/previous" to every ActiveRecord objects.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:'Helvetica Neue';color:#222222;"&gt;&lt;span class="Apple-style-span" style="line-height: 24px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:'Helvetica Neue';color:#222222;"&gt;&lt;span class="Apple-style-span" style="line-height: 24px;"&gt;&lt;b&gt;INSTALL&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:'Helvetica Neue';color:#222222;"&gt;&lt;span class="Apple-style-span" style="line-height: 24px;"&gt;This plugin requires Rails 2.1+ currently. Install it by below command:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:'Helvetica Neue';color:#222222;"&gt;&lt;span class="Apple-style-span" style="line-height: 24px;"&gt;   ruby script/plugin install git://github.com/Aaron2Ti/records_sequence.git&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:'Helvetica Neue';color:#222222;"&gt;&lt;span class="Apple-style-span" style="line-height: 24px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:'Helvetica Neue';color:#222222;"&gt;&lt;span class="Apple-style-span" style="line-height: 24px;"&gt;&lt;b&gt;USAGE&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:'Helvetica Neue';color:#222222;"&gt;&lt;span class="Apple-style-span" style="line-height: 24px;"&gt;After installed, your models could:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:'Helvetica Neue';color:#222222;"&gt;&lt;span class="Apple-style-span" style="line-height: 24px;"&gt;&lt;pre name="code" class="ruby"&gt;foo = User.first&lt;br /&gt;bar = foo.next&lt;br /&gt;foo_neighbour = foo.previous # returns nil if foo has no previous neighbour&lt;br /&gt;&lt;br /&gt;#The sequence's sorted column is defined by the new option :sorted_by,&lt;br /&gt;# default is the 'id' column.&lt;br /&gt;foo = User.last&lt;br /&gt;pre_foo_sorted_by_id = foo.previous&lt;br /&gt;pre_foo_sorted_by_age = foo.previous(:sorted_by =&gt; 'age')&lt;br /&gt;&lt;br /&gt;#Also works fine with most other ActiveRecord's find options:&lt;br /&gt;foo = User.find 30&lt;br /&gt;foo.next(:conditions =&gt; ['age &lt; ?', 20]) foo.previous(:offset =&gt; 2)&lt;br /&gt;foo.next(:sorted_by =&gt; 'address', :order =&gt; 'name DESC, age')&lt;br /&gt;foo.previous( :sorted_by =&gt; 'age', :conditions =&gt; ['age &lt; ?', 20],  &lt;br /&gt;     :order =&gt; 'name DESC, address', :offset =&gt; 2 )&lt;br /&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:'Helvetica Neue';color:#222222;"&gt;&lt;span class="Apple-style-span" style="line-height: 24px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:'Helvetica Neue';color:#222222;"&gt;&lt;span class="Apple-style-span" style="line-height: 24px;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8360991241158352605-8768999303952370371?l=aaron2ti.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8360991241158352605/posts/default/8768999303952370371'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8360991241158352605/posts/default/8768999303952370371'/><link rel='alternate' type='text/html' href='http://aaron2ti.blogspot.com/2008/06/plugin-released-recordssequence.html' title='Plugin released - records_sequence'/><author><name>Aaron</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-8360991241158352605.post-1513664036493106604</id><published>2008-06-13T13:19:00.003+08:00</published><updated>2008-06-18T13:23:05.666+08:00</updated><title type='text'>Next &amp; Previous Extension to ActiveRecord</title><content type='html'>&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Within Rails 2.1, ActiveRecord was added lots of flexibility, but I also want to  have some next or previous functions built with the ActiveRecord model like  below:&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="ruby"&gt;&lt;br /&gt;# find first foo&lt;br /&gt;foo = Foo.first&lt;br /&gt;&lt;br /&gt;# find next foo&lt;br /&gt;next_foo = foo.next&lt;br /&gt;&lt;br /&gt;# find next foo with defined sort column or conditions&lt;br /&gt;next_foo = foo.next(:sort =&gt; :age, :conditions ...)&lt;br /&gt;&lt;br /&gt;# previous function also.&lt;br /&gt;previous_foo = foo.previous&lt;br /&gt;&lt;br /&gt;#...&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8360991241158352605-1513664036493106604?l=aaron2ti.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8360991241158352605/posts/default/1513664036493106604'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8360991241158352605/posts/default/1513664036493106604'/><link rel='alternate' type='text/html' href='http://aaron2ti.blogspot.com/2008/06/test-code-highlight.html' title='Next &amp; Previous Extension to ActiveRecord'/><author><name>Aaron</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-8360991241158352605.post-5220833844129152836</id><published>2007-09-16T15:50:00.000+08:00</published><updated>2007-09-17T09:19:11.438+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='Parameterized'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='solidworks'/><category scheme='http://www.blogger.com/atom/ns#' term='module desgin'/><title type='text'>Parameterized module design Using Ruby on Rails</title><content type='html'>&lt;div&gt;   A long time I wrote noting. Last month I had my first holiday vocation after 'working' , that's really precious to me.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;  Back to work, I have a mission to do some parameterized module design through the web. It means that, someone submit some params through their browsers, then the server renders the submitted params to the 3D model and changes the model, the users could retrieve the changed 3D models then.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I try to use ruby on rails and Solidworks to make a demo a demo of this application.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;One difficult of this solution is how data flow through the application. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In my mind, firstly the user submit data to the server, then the server transfer the data to the ruby app.    Secondly, ruby could manipulate the Solidworks through 'win32ole' and fill the data. &lt;/div&gt;&lt;br /&gt;&lt;div&gt;After Solidworks changes the model doc file and saves it to somewhere user could download from in the server.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Followed is the lib/solidworks.rb I wrote in my rails application:&lt;/div&gt;&lt;div  style="background: #000000;font: bold 12pt/14pt Times, serif; color: #cccccc;font-family:monospace"&gt;&lt;span style="background: #000000;font: bold 12pt/14pt Times, serif; color: #cccccc;font-family:monospace"&gt;&lt;pre&gt;&lt;br /&gt;1 &lt;span style="color:#ff80ff;"&gt;require&lt;/span&gt;&lt;span class="c0"&gt; &lt;/span&gt;&lt;span style="color:#ffa500;"&gt;'&lt;/span&gt;&lt;span style="color:#ffa0a0;"&gt;win32ole&lt;/span&gt;&lt;span style="color:#ffa500;"&gt;'&lt;/span&gt;&lt;br /&gt;2&lt;br /&gt;3 &lt;span style="color:#ff80ff;"&gt;module&lt;/span&gt;&lt;span class="c298"&gt; &lt;/span&gt;&lt;span style="color:#60ff60;"&gt;ModelDoc&lt;/span&gt;&lt;br /&gt;4 &lt;span class="c298"&gt;  &lt;/span&gt;&lt;span style="color:#ff80ff;"&gt;def&lt;/span&gt;&lt;span class="c298"&gt; &lt;/span&gt;&lt;span style="color:#40ffff;"&gt;saveAs&lt;/span&gt;&lt;span class="c298"&gt;(filename)&lt;/span&gt;&lt;br /&gt;5 &lt;span class="c298"&gt;    &lt;/span&gt;&lt;span style="color:#ffa0a0;"&gt;self&lt;/span&gt;&lt;span class="c298"&gt;.SaveAs3(filename, &lt;/span&gt;&lt;span style="color:#ffa0a0;"&gt;0&lt;/span&gt;&lt;span class="c298"&gt;, &lt;/span&gt;&lt;span style="color:#ffa0a0;"&gt;0&lt;/span&gt;&lt;span class="c298"&gt;)&lt;/span&gt;&lt;br /&gt;6 &lt;span class="c298"&gt;  &lt;/span&gt;&lt;span style="color:#ff80ff;"&gt;end&lt;/span&gt;&lt;br /&gt;7 &lt;span class="c298"&gt;  &lt;/span&gt;&lt;span style="color:#ff80ff;"&gt;def&lt;/span&gt;&lt;span class="c298"&gt; &lt;/span&gt;&lt;span style="color:#40ffff;"&gt;save&lt;/span&gt;&lt;br /&gt;8 &lt;span class="c298"&gt;    &lt;/span&gt;&lt;span style="color:#ffa0a0;"&gt;self&lt;/span&gt;&lt;span class="c298"&gt;.EditRebuild3&lt;/span&gt;&lt;br /&gt;9 &lt;span class="c298"&gt;    &lt;/span&gt;&lt;span style="color:#ffa0a0;"&gt;self&lt;/span&gt;&lt;span class="c298"&gt;.ViewZoomtofit2&lt;/span&gt;&lt;br /&gt;10 &lt;span class="c298"&gt;    &lt;/span&gt;&lt;span style="color:#ffa0a0;"&gt;self&lt;/span&gt;&lt;span class="c298"&gt;.Save2 &lt;/span&gt;&lt;span style="color:#ffa0a0;"&gt;false&lt;/span&gt;&lt;br /&gt;11 &lt;span class="c298"&gt;  &lt;/span&gt;&lt;span style="color:#ff80ff;"&gt;end&lt;/span&gt;&lt;br /&gt;12 &lt;span class="c298"&gt;  &lt;/span&gt;&lt;span style="color:#ff80ff;"&gt;def&lt;/span&gt;&lt;span class="c298"&gt; &lt;/span&gt;&lt;span style="color:#40ffff;"&gt;setValue&lt;/span&gt;&lt;span class="c298"&gt;(parameter, value = &lt;/span&gt;&lt;span style="color:#ffa0a0;"&gt;0.01&lt;/span&gt;&lt;span class="c298"&gt;)&lt;/span&gt;&lt;br /&gt;13 &lt;span class="c298"&gt;    &lt;/span&gt;&lt;span style="color:#ffa0a0;"&gt;self&lt;/span&gt;&lt;span class="c298"&gt;.Parameter(parameter).SystemValue = value&lt;/span&gt;&lt;br /&gt;14 &lt;span class="c298"&gt;  &lt;/span&gt;&lt;span style="color:#ff80ff;"&gt;end&lt;/span&gt;&lt;br /&gt;15 &lt;span class="c298"&gt;  &lt;/span&gt;&lt;span style="color:#ff80ff;"&gt;def&lt;/span&gt;&lt;span class="c298"&gt; &lt;/span&gt;&lt;span style="color:#40ffff;"&gt;closeDoc&lt;/span&gt;&lt;span class="c298"&gt;(docName)&lt;/span&gt;&lt;br /&gt;16 &lt;span class="c298"&gt;    &lt;/span&gt;&lt;span style="color:#ffa0a0;"&gt;self&lt;/span&gt;&lt;span class="c298"&gt;.CloseDoc docName&lt;/span&gt;&lt;br /&gt;17 &lt;span class="c298"&gt;  &lt;/span&gt;&lt;span style="color:#ff80ff;"&gt;end&lt;/span&gt;&lt;br /&gt;18 &lt;span style="color:#ff80ff;"&gt;end&lt;/span&gt;&lt;br /&gt;19&lt;br /&gt;20 &lt;span style="color:#ff80ff;"&gt;module&lt;/span&gt;&lt;span class="c298"&gt; &lt;/span&gt;&lt;span style="color:#60ff60;"&gt;SldWorks&lt;/span&gt;&lt;br /&gt;21 &lt;span class="c298"&gt;  &lt;/span&gt;&lt;span style="color:#ff80ff;"&gt;def&lt;/span&gt;&lt;span class="c298"&gt; &lt;/span&gt;&lt;span style="color:#40ffff;"&gt;openDoc&lt;/span&gt;&lt;span class="c298"&gt;(filename, filetype = &lt;/span&gt;&lt;span style="color:#ffa0a0;"&gt;1&lt;/span&gt;&lt;span class="c298"&gt;)&lt;/span&gt;&lt;br /&gt;22 &lt;span class="c298"&gt;    &lt;/span&gt;&lt;span style="color:#ffa0a0;"&gt;self&lt;/span&gt;&lt;span class="c298"&gt;.OpenDoc(filename, filetype)&lt;/span&gt;&lt;br /&gt;23 &lt;span class="c298"&gt;    activeDoc&lt;/span&gt;&lt;br /&gt;24 &lt;span class="c298"&gt;  &lt;/span&gt;&lt;span style="color:#ff80ff;"&gt;end&lt;/span&gt;&lt;br /&gt;25 &lt;span class="c298"&gt;  &lt;/span&gt;&lt;span style="color:#ff80ff;"&gt;def&lt;/span&gt;&lt;span class="c298"&gt; &lt;/span&gt;&lt;span style="color:#40ffff;"&gt;activeDoc&lt;/span&gt;&lt;span class="c298"&gt;()&lt;/span&gt;&lt;br /&gt;26 &lt;span class="c298"&gt;    &lt;/span&gt;&lt;span style="color:#ffa0a0;"&gt;self&lt;/span&gt;&lt;span class="c298"&gt;.ActiveDoc().extend &lt;/span&gt;&lt;span style="color:#60ff60;"&gt;ModelDoc&lt;/span&gt;&lt;br /&gt;27 &lt;span class="c298"&gt;  &lt;/span&gt;&lt;span style="color:#ff80ff;"&gt;end&lt;/span&gt;&lt;br /&gt;28 &lt;span class="c298"&gt;  &lt;/span&gt;&lt;span style="color:#ff80ff;"&gt;def&lt;/span&gt;&lt;span class="c298"&gt; &lt;/span&gt;&lt;span style="color:#40ffff;"&gt;exit&lt;/span&gt;&lt;br /&gt;29 &lt;span class="c298"&gt;    &lt;/span&gt;&lt;span style="color:#ffa0a0;"&gt;self&lt;/span&gt;&lt;span class="c298"&gt;.ExitApp()&lt;/span&gt;&lt;br /&gt;30 &lt;span class="c298"&gt;  &lt;/span&gt;&lt;span style="color:#ff80ff;"&gt;end&lt;/span&gt;&lt;br /&gt;31 &lt;span style="color:#ff80ff;"&gt;end&lt;/span&gt;&lt;br /&gt;32&lt;br /&gt;33 &lt;span style="color:#ff80ff;"&gt;def&lt;/span&gt;&lt;span class="c298"&gt; &lt;/span&gt;&lt;span style="color:#40ffff;"&gt;solidworks&lt;/span&gt;&lt;br /&gt;34 &lt;span class="c298"&gt;  &lt;/span&gt;&lt;span style="color:#ffff00;"&gt;begin&lt;/span&gt;&lt;br /&gt;35 &lt;span class="c305"&gt;    &lt;/span&gt;&lt;span style="color:#40ffff;"&gt;@sldworks&lt;/span&gt;&lt;span class="c305"&gt; = &lt;/span&gt;&lt;span style="color:#60ff60;"&gt;WIN32OLE&lt;/span&gt;&lt;span class="c305"&gt;.connect(&lt;/span&gt;&lt;span style="color:#ffa500;"&gt;'&lt;/span&gt;&lt;span style="color:#ffa0a0;"&gt;SldWorks.Application&lt;/span&gt;&lt;span style="color:#ffa500;"&gt;'&lt;/span&gt;&lt;span class="c305"&gt;)&lt;/span&gt;&lt;br /&gt;36 &lt;span class="c305"&gt;  &lt;/span&gt;&lt;span style="color:#ffff00;"&gt;rescue&lt;/span&gt;&lt;span class="c305"&gt; &lt;/span&gt;&lt;span style="color:#60ff60;"&gt;WIN32OLERuntimeError&lt;/span&gt;&lt;br /&gt;37 &lt;span class="c305"&gt;    &lt;/span&gt;&lt;span style="color:#40ffff;"&gt;@sldworks&lt;/span&gt;&lt;span class="c305"&gt; = &lt;/span&gt;&lt;span style="color:#60ff60;"&gt;WIN32OLE&lt;/span&gt;&lt;span class="c305"&gt;.new(&lt;/span&gt;&lt;span style="color:#ffa500;"&gt;'&lt;/span&gt;&lt;span style="color:#ffa0a0;"&gt;SldWorks.Application&lt;/span&gt;&lt;span style="color:#ffa500;"&gt;'&lt;/span&gt;&lt;span class="c305"&gt;)&lt;/span&gt;&lt;br /&gt;38 &lt;span class="c305"&gt;  &lt;/span&gt;&lt;span style="color:#ffff00;"&gt;end&lt;/span&gt;&lt;br /&gt;39 &lt;span class="c298"&gt;  &lt;/span&gt;&lt;span style="color:#40ffff;"&gt;@sldworks&lt;/span&gt;&lt;span class="c298"&gt;.extend &lt;/span&gt;&lt;span style="color:#60ff60;"&gt;SldWorks&lt;/span&gt;&lt;br /&gt;40 &lt;span style="color:#ff80ff;"&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;hr /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;The most suck problem to use Soildworks API is the pointer params, most APIs have parameters like followed:&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;blockquote&gt;OpenDoc6 ( filename, type, options, configuration, &amp;amp;Errors, &amp;amp;Warnings )&lt;/blockquote&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;amp;Errors and  &amp;amp;Warnings are pointer type, but Ruby don't support pointer type that may be a big problem!&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For some other suggestions look this guy's  &lt;a href="http://cuito.us/past/2006/11/28/solidworks_ruby_scr"&gt;blog&lt;/a&gt;.&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8360991241158352605-5220833844129152836?l=aaron2ti.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8360991241158352605/posts/default/5220833844129152836'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8360991241158352605/posts/default/5220833844129152836'/><link rel='alternate' type='text/html' href='http://aaron2ti.blogspot.com/2007/09/parameterized-module-design-using-ruby.html' title='Parameterized module design Using Ruby on Rails'/><author><name>Aaron</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-8360991241158352605.post-7717693778436563663</id><published>2007-08-23T20:43:00.002+08:00</published><updated>2008-06-13T12:58:12.108+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='restful'/><category scheme='http://www.blogger.com/atom/ns#' term='rest'/><category scheme='http://www.blogger.com/atom/ns#' term='route'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='bug'/><title type='text'>Rails Restful routing</title><content type='html'>&lt;strong&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;Just now I tried to write some some restful application using rails, then I found there is some thing wront with Rails' routing.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;In my application , there were three models: book , person and library, a person or library may have many books, but the book can only have one owner----person or library.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;After setup other relationships in the models, I wrote this in the route.rb:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;map.resources :books,  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;:path_prefix =&gt; '/person/:person_id',&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;:name_prefix =&gt; 'person_'&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;map.resources :books,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;              :path_prefix =&gt; '/library/:library_id',&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt; :name_prefix =&gt; 'library_'&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;And in the controller , I done something like this:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;if params[:person_id]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;   ........&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;  elsif params[:library_id]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;   .......&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;  end&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;That worked well.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;But I felt that either person or library was the book's owner, so I refactor the routing to this one for cleaning the url:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;blockquote&gt;&lt;span&gt;&lt;strong&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;map.resources :books,  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;:path_prefix =&gt; '/owner/:person_id',&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;:name_prefix =&gt; 'person_'&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;map.resources :books,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;              :path_prefix =&gt; '/owner/:library_id',&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt; :name_prefix =&gt; 'library_'&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;strong&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;Controllers changed nothing,  then something wrong still.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;It's impossible to pass the "params[:library_id]" using any of the helper the methods like "library_new_book, library_...." etc.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;In the development.log , I found Parameters from the "library" name-prefix url helper had the same parameter---"Parameters:{"action"=&gt;..., "controller"=&gt;..., "person_id"=&gt;3 }".&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;&lt;strong&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;&lt;span&gt;&lt;span&gt;&lt;strong&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;The "person_id" was  excepted to "library_id"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;!&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;strong&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;Then I changed the order of the routing  :&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;&lt;strong&gt;&lt;blockquote&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;map.resources :books,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;              :path_prefix =&gt; '/owner/:library_id',&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt; :name_prefix =&gt; 'library_'&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;map.resources :books,  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;:path_prefix =&gt; '/owner/:person_id',&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;:name_prefix =&gt; 'person_'&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;/strong&gt;&lt;/span&gt;&lt;strong&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;This time the parameter "params[:person_id]" didn't work at all when using the helper like "person_new_book(1)" , "person_books (1)",etc.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;Seemed in this case , Rails may use the first path-prefix's params for all the next routings whose path-prefix has the same path.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:arial;"&gt;That's quite confused!!&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8360991241158352605-7717693778436563663?l=aaron2ti.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8360991241158352605/posts/default/7717693778436563663'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8360991241158352605/posts/default/7717693778436563663'/><link rel='alternate' type='text/html' href='http://aaron2ti.blogspot.com/2007/08/rails-restful-routing-bug.html' title='Rails Restful routing'/><author><name>Aaron</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-8360991241158352605.post-6763009066873345719</id><published>2007-08-19T18:04:00.001+08:00</published><updated>2008-06-13T13:00:19.465+08:00</updated><title type='text'>About Me</title><content type='html'>I am Aaron Tian(Chinese name: Tian Baoqing), 24 years old.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8360991241158352605-6763009066873345719?l=aaron2ti.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8360991241158352605/posts/default/6763009066873345719'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8360991241158352605/posts/default/6763009066873345719'/><link rel='alternate' type='text/html' href='http://aaron2ti.blogspot.com/2007/08/starting.html' title='About Me'/><author><name>Aaron</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry></feed>
