Ruby on Rails Wednesday, May 1, 2013



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 rubyonrails-talk+unsubscribe@googlegroups.com.
To post to this group, send email to rubyonrails-talk@googlegroups.com.
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.
 
 

No comments:

Post a Comment