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.


Reply via email to