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?
>

Apologies to both Colin and Tamouse.  Indeed as Colin surmised the error is:

     undefined method `each' for nil:NilClass

     Extracted source (around line *#13*):

    10: 

     11:   </tr>

     12: 

      13: <% @appetizers_list.each do |app| %>

       14:   <tr>

       15:     <td><%= app.title %></td>

        16:     <td><%= app.body %></td>


I did try what was suggested in this blog post - 
http://www.jacopretorius.net/2012/02/scopes-in-rails.html which involves 
creating a controller action adding a custom route and creating a link_to 
in the view.   This worked but at the expense of adding more to the 
controller.  Here is that solution:


*Action in Post Controller:*

       def appetizers

      @posts = Post.appetizers

      render 'index' 

       end

*Route: *

         get 'posts/appetizers' => 'posts#appetizers', :as => 
'appetizers_posts'

*Change in Post Model:*

            scope :appetizers, -> { where(:category_id => 3)}

And change in the view to be a link:

         <% @posts.each do |post| %>

        <tr>

           <td><%= post.title %></td>

           <td><%= post.body %></td>

           <td><%= post.category.name%></td>

         </tr>

        <% end %>

        <%= link_to 'Appetizers', appetizers_posts_path %>

So this works but it seems like it is not the best way to do it - seems 
like the controller would get bloated if there are a lot of categories. 
 Another issue  is that in the scope I have to use category_id => 3 to get 
the appetizers to list.  I would like at least to have "post.category.name 
=> "Appetizers" so to be more clear about what is being scoped but this 
give me an error:

    undefined method `key?' for nil:NilClass

I have a feeling there are many ways to display the appetizer listing in 
the view.  Adding actions to the controller and adding routes seems not 
elegant.  Can you suggest an alternative and or point to the concept I seem 
to be missing in understanding how to display a subset of information from 
the database in the view.   I would like to use scopes and perhaps a method 
in the model... 

Again, sorry for not posting the error, I appreciate any comments you can 
give on the subject.     


-- 
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/-/f3C3hQ8k29AJ.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to