On Monday, April 29, 2013 6:39:56 PM UTC-4, akkdio wrote:
>
> am a beginner and I appreciate an answer to help me understand where my
> knowledge gap is:
>
> The app is to display a post. The posts belong to a category (appetizers,
> entrees...) My thought was to use scopes to display all the appetizers on
> the posts in one view and then have the entrees in another view and so on.
>
> The models:
>
> class Post < ActiveRecord::Base
> attr_accessible :body, :category_id, :title
>
> belongs_to :category
>
> scope :appetizers, -> { where(post.category.name => "Appetizers")}
>
> end
>
>
> class Category < ActiveRecord::Base
> attr_accessible :name
>
> has_many :posts
> end
>
> In the view I want to loop through the posts where the category name is
> "Appetizers".
>
> <table>
> <tr>
> <th>Title</th>
> <th>Body</th>
> <th>Category</th>
> </tr>
>
> <% @post.appetizers.each do |app| %>
> <tr>
> <td><%= app.title %></td>
> <td><%= app.body %></td>
> <td><%= app.category.name%></td>
> </tr>
> <% end %>
> </table>
>
> I am getting an "undefined method" error. I have tried searching for an
> example here that explains what is a correct solution. I also tried
> creating a method in the Post model like this:
>
> def appetizers_list
>
> @appetizer_list = Post.appetizers.all
>
> end
>
> Then call the method in the view:
>
> <% @appetizer_list.each do |app| %>
> <tr>
> <td><%= app.title %></td>
> <td><%= app.body %></td>
> <td><%= app.category.name%></td>
> </tr>
>
> Obviously I am confusing what needs to be done after creating the scope
> and how to get the view to "see" it. Or if I need a scope at all and it can
> be done in a more simple way.
>
> So is there a best practices for retrieving subsets of data in rails and
> displaying them to the view?
>
Thank you Fred.
This worked great:
Rails doesn't understand that post.category.name in the where
clause (not in relation to a specific post) means to add a condition on the
category's name. You'd have to do
something like
scope :appetizers, -> {joins(:category).where(:categories =>
{:name => 'Appetizers'})}
I understand it a little but will have to learn more about why it works.
I would like to do this:
I'd suggest adding a single route/action for displaying the
posts from any category.
I will do some reading to see how I need to set it up as I think it would
help me avoid creating a new route for each category.
I took a gander at friendly_id and it look interesting however, I want to
get the basics down before I make it pretty...
I tried playing around with this idea:
@posts = Category.find(params[:category_id]).posts
I think what you mean is to create a method in the Post controller that
will return a list of a specific category. How would I call the method in
the view so that the it picks up the category_id. I have done the
following:
In the Post controller:
def category_show
@posts = Category.find(params[:category_id]).posts
render 'index'
end
in the route.rb
get 'posts/category_show' => 'posts#category_show', :as =>
'category_show'
In the view: (THIS IS WRONG)
<% @posts.each do |post| %>
<tr>
<td><%= post.title %></td>
<td><%= post.body %></td>
<td><%= post.category.name%></td>
<td><%= link_to 'category_show', category_show_path %></td>
</tr>
<% end %>
This results in a error:
Couldn't find Category without an ID
Fred - thank you for getting me this far. Any comments on the above would
be appreciated.
--
You received this message because you are subscribed to the Google Groups "Ruby
on Rails: Talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msg/rubyonrails-talk/-/2lkO_EuwQMsJ.
For more options, visit https://groups.google.com/groups/opt_out.