I have some code working that lists only items from a particular user. The code in my list action finds the user and then conditionally lists only his/her items: def list user = User.find(session[:user]) user_id = user.id @product_pages, @products = paginate :products, :per_page => 10, :conditions =>[''user_id = ?'', user.id] end So far so good! Now I''d like to create an object an automatically add the user''s id to the user_id field in the product table. I don''t want to keep typing the user = User.find stuff over and over again so thought that I could create a private method and have it work that way, but I''m having trouble with.. syntax. private def find_user user = Usr.find(session[:user]) user_id = user.id end end And then changing my list to def list @user = find_user @product_pages, @products = paginate :products, :per_page => 10, :conditions =>[''user_id = ?'', @user] end Gives me an error about unknown method user. Can somebody save me lots of typing of the same thing over & over again? -- Posted via http://www.ruby-forum.com/.
product belongs_to :user user has_many :products when saving a new product @product.user = session[:user] Then you can do things like... user.products you could also just store the entire user object in your session and use it as needed. On Thursday, April 20, 2006, at 1:29 AM, Vince W. wrote:>I have some code working that lists only items from a particular user. >The code in my list action finds the user and then conditionally lists >only his/her items: > > def list > user = User.find(session[:user]) > user_id = user.id > @product_pages, @products = paginate :products, :per_page => 10, > :conditions =>[''user_id = ?'', >user.id] > end > >So far so good! > >Now I''d like to create an object an automatically add the user''s id to >the user_id field in the product table. I don''t want to keep typing the >user = User.find stuff over and over again so thought that I could >create a private method and have it work that way, but I''m having >trouble with.. syntax. > >private > def find_user > user = Usr.find(session[:user]) > user_id = user.id > end >end > >And then changing my list to > > def list > @user = find_user > @product_pages, @products = paginate :products, :per_page => 10, > :conditions =>[''user_id = ?'', >@user] > end > >Gives me an error about unknown method user. Can somebody save me lots >of typing of the same thing over & over again? > >-- >Posted via http://www.ruby-forum.com/. >_______________________________________________ >Rails mailing list >Rails@lists.rubyonrails.org >http://lists.rubyonrails.org/mailman/listinfo/rails_Kevin -- Posted with http://DevLists.com. Sign up and save your mailbox.
Kevin Olbrich wrote:> product belongs_to :user > user has_many :products > > when saving a new product > @product.user = session[:user] > > Then you can do things like... > > user.products >Ok, I added belongs_to :user in my product.rb model and has_many :products in my user.rb model. Then I tried to rewrite my post list code to: @product_pages, @user.products = paginate :products, :per_page => 10 but that gives me a nil object error. I then tried it as @product_pages, products = paginate :user.products, :per_page => 10 but got a unknown method ''user'' error Any pointers? -- Posted via http://www.ruby-forum.com/.
Vince, Perhaps you should have a look at how Ruby does objects, methods, and variables? The Poignant Guide might be helpful: http://poignantguide.net/ruby/ Anyhow, you don''t need this line if you''re using "user.id" to refer to the user''s id: user_id = user.id Also, since you''re using session[:user] to store a user''s id, you *could* get away with removing the first two lines and just doing this: @product_pages, @products = paginate :products, :per_page => 10, :conditions => [''user_id = ?'', session[:user]] But maybe it''s not a good idea to assume there''ll be a usable user id in session[:user]. Plus, maybe you have a few actions in that controller that refer to the same user. In that case, you could write a private (or protected, maybe) function like this: def find_user @user = User.find(session[:user]) end That sets the @user instance variable to the user that''s referred to in the session, so you can use @user in other methods. You might say: @product_pages, @products = paginate :products, :per_page => 10, :conditions => [''user_id = ?'', @user.id] And so you don''t have to call find_user in every method, you could use a filter: before_filter :find_user Or (and this is what I do sometimes) you could have a function called "current_user" which returns the user with the id stored in session [:user]: def current_user @current_user ||= User.find(session[:user]) end This says (sort of) "if the @current_user instance variable isn''t set already, set it to the user that the User model finds with the user id in the session, and then return the value of @current_user. Then you can say: @product_pages, @products = paginate :products, :per_page => 10, :conditions => [''user_id = ?'', current_user.id] Also, if you''re just starting to develop your application and you don''t have a login system yet, (which is really easy to add later but is pretty mechanical, so it''s a good idea to ignore it) you could just tell current_user to return, for example: User.find_by_name("vince") And you''re always logged in! When you put your login system in, just tell current_user to look at the session, or however else you might keep track of users. -- Michael Daines http://www.mdaines.com On Apr 19, 2006, at 4:29 PM, Vince W. wrote:> I have some code working that lists only items from a particular user. > The code in my list action finds the user and then conditionally lists > only his/her items: > > def list > user = User.find(session[:user]) > user_id = user.id > @product_pages, @products = paginate :products, :per_page => 10, > :conditions =>[''user_id = ?'', > user.id] > end > > So far so good! > > Now I''d like to create an object an automatically add the user''s id to > the user_id field in the product table. I don''t want to keep > typing the > user = User.find stuff over and over again so thought that I could > create a private method and have it work that way, but I''m having > trouble with.. syntax. > > private > def find_user > user = Usr.find(session[:user]) > user_id = user.id > end > end > > And then changing my list to > > def list > @user = find_user > @product_pages, @products = paginate :products, :per_page => 10, > :conditions =>[''user_id = ?'', > @user] > end > > Gives me an error about unknown method user. Can somebody save me > lots > of typing of the same thing over & over again?
Michael, Kevin Thanks very much for your help. It''s really saved me a tremendous amount of time and works very well. I had a couple of warn statements that were throwing me off but once I figured that out your solution works perfectly. Thanks again, Vince -- Posted via http://www.ruby-forum.com/.