Hello!
I’m trying to create a menu. I have a controller that takes two
attributes, like this:
def category(gender, category)
@ads = Ad.find_all_by_gender_and_category(gender,
category).paginate(:page => params[:page])
@title = “Startsidan”
render ‘home’
end
And in my view I have a list with menu options:
<%= link_to "Accessoarer", :action =>
"category('dam', 'Accessoarer')" %>
And my routes it look like this:
match ‘/dam-accessoarer’, :to => “pages#category(‘dam’,
‘Accessoarer’)”
But it doesn’t work.
I get the following error.
Unknown action
The action ‘category(‘dam’, ‘Accessoarer’)’ could not be found for
PagesController
Any help on how to solve it would be greatly appreciated!
Thanks!
// Anders
On Sat, Oct 9, 2010 at 7:41 AM, Anders_P [email protected]
wrote:
end
Is this your controller code? If so you have issues as (someone correct
me
if this is a new Rails 3 construct that I am clueless) you should not be
taking arguments in the signature. If the params gender and category are
needed they should be accessed as params[:gender] params[:category].
So in your view you need something like this below. Also see
link_to (ActionView::Helpers::UrlHelper) - APIdock for info
on
link_to helper.
<%= link_to “Accessories”, :controller => “categories”, :action =>
“show”,
:gender => “male”, :category => “zzz”
and then in your controller action
def show
gender = params[:gender]
category = params[:category]
now do what you want with the data
end
David
Hi! Thanks for your help. But I still doesn’t get it to work. I’ve
changed the controller action so it looks like:
def category
gender = params[:gender]
category = params[:category]
@ads = Ad.find_all_by_gender_and_category(gender,
category).paginate(:page => params[:page])
@title = “Startsidan”
render ‘home’
end
And in the view:
<%= link_to "Accessoarer", :action =>
'category', :gender => 'female', :category => 'Accessoarer' %>
When I press the link the url changes to this:
http://localhost:3000/kategori?gender=female&category=Accessoarer
I don’t get any errors, but it doesn’t find anything. Any idea on what
might be wrong?
// Anders
On Sat, Oct 9, 2010 at 11:13 AM, Anders_P [email protected]
wrote:
end
I don’t get any errors, but it doesn’t find anything. Any idea on what
might be wrong?
So you are rendering the ‘home’ view - can you show me this? Also,
describe
what you are expecting to see. Have you also verified that you are
getting
good values on @ads and @title (which I assume you are doing something
with
in your view)? I would recommend if you have not used it yet to get
familiar
with ruby-debug. This way you can step in to your controller in action
and
check these attributes (of course even better is get used to writing
tests
for your code, but I know this might be overwhelming at first).
Let me know - if you need help with ruby-debug let me know — if so do
give
me the version of Rails and version of Ruby you are running.
Hi!
Here is what I think it the most relevant part of the home view,
Renders the menu
<%= render “shared/categories” %>
.
.
.
Renders ads, unless its empty
<% if @ads.empty? %>
Hittade inga annonser.
<% else %>
<%= render @ads %>
<% end %>
<%= will_paginate @ads, :previous_label => t(:previous), :next_label
=> t(:next) %>
I’m getting “Hittade inga annonser” which means “Couldn’t find any
ads” when I click on the link, but it shouldn’t be empty. It should
render all ads that matches a certain condition, for example, :gender
=> ‘female’, category => ’ accessories’. I have checked the database
and it should get two rows.
It works when I have methods like this:
def female_accessories
@ads = Ad.find_all_by_gender_and_category(‘dam’,
‘Accessoarer’).paginate(:page => params[:page])
@title = “Startsidan”
render ‘home’
end
But this isn’t very DRY, since I would need to have an action for
every category. I want something slightly more dynamic.
I hope i’m understandable.
Tips and links regarding ruby-debug would be really nice!
Thanks!
// Anders
Thanks for your tips, I think I will follow your suggestion and create
a new model ‘Category’, think it will get a lot cleaner.
Thanks.
// Anders
On Sat, Oct 9, 2010 at 12:17 PM, Anders_P [email protected]
wrote:
@ads = Ad.find_all_by_gender_and_category('dam',
'Accessoarer').paginate(:page => params[:page])
@title = "Startsidan"
render 'home'
end
But this isn’t very DRY, since I would need to have an action for
every category. I want something slightly more dynamic.
Right - this is going to be a very ugly controller in no time. But fix
the
problem at hand and then you can play with making it dry. Google the
term
‘named scopes’ in google and this may help. If nothing else, move this
kind
of logic into a model, it should not be in a controller. Controller
ideally
just handles requests and routing of them, business logic should be in
models or other classes.
I hope i’m understandable.
Tips and links regarding ruby-debug would be really nice!
This is probably a good place to pick up ruby debug.
Do this:
-
gem install ruby-debug
(note if you are using Rails 3 and Ruby 1.9.2 you might need: gem
install
ruby-debug19. This is what I am using.)
-
Now you can put a breakpoint wherever you want by typing ‘debugger’
where
you want the execution to stop — so for example:
def female_accessories
debugger
@ads = Ad.find_all_by_gender_and_category(‘dam’,
‘Accessoarer’).paginate(:page => params[:page])
@title = “Startsidan”
render ‘home’
end
- Then restart your rails server:
If Rails 3:
rails server --debugger
If < Rails 3:
script/server --debugger
- Now execute your page - load the page. The execution will stop when
you
get to the break point. Go to your server console and you should see
some
familiar code and line number. From there you can type in whatever ruby
you
want to debug (like irb). Type ‘n’ to go to the next line, ‘c’ to
continue.
Using this you should be able to figure out what is going on in your
code.
Great tool to have, I use it often several times a day.
Glad to help. Definitely if you have not, at least for your models try
to
start writing some tests – I use rspec now but honestly if you are new
to
tdd you could use test/unit just fine and get used to the process. The
way I
see it is in the past before I wrote tests, I would write code and then
spend time debugging. I found that writing tests as I go actually
formalizes
the debugging process I would go through, and then of course the result
is a
test suite you can run whenever you want — and at least you will know
the
things you are testing for still work! I promise you will get addicted.