0

Hi I'm following a rails tutorial and i've kind of veered off the tutorial to do some different things...& i hit a snag. So the tutorial (michael hartl's) creates a feed of microposts, but it doesn't give each micropost its own page. This is what i'm trying to do and can't seem to get it working.

So in the feed view which i'm calling "activity" i've got:

<li id="<%= activity_item.id %>">
  <%= link_to gravatar_for(activity_item.user, :size => 200), activity_item.user %><br clear="all">
  <span class="title"><%= link_to activity_item.title, @micropost %></span><br clear="all">
  <span class="user">
  Joined by <%= link_to activity_item.user.name, activity_item.user %>
  </span><br clear="all">
  <span class="timestamp">
 <%= time_ago_in_words(activity_item.created_at) %> ago.
 </span>
 <% if current_user?(activity_item.user) %>
 <%= link_to "delete", activity_item, :method => :delete,
                                     :confirm => "Are you sure?",
                                     :title => activity_item.content %>
 <% end %>
</li>

And when i click on the actual micropost "title" i get the following error saying i've got "No route matches [GET] "/microposts". I'm sure this is probably an easy fix i'm missing, but I'm a beginner & I've been goin too long & my brain is fried.

What i basically need to have happen is when i click on the title of a micropost from my activity feed...I need it to go to the unique #show page of that micropost id.

Here are the models / controllers i believe are relevant. If i need to post anything else just let me know. I appreciate any and all help! Thanks!

static_pages_controller (the home page is where my activity feed shows up

class StaticPagesController < ApplicationController

  def home
    if signed_in?
     @micropost = current_user.microposts.build

     @activity_items = current_user.activity.paginate(:page => params[:page])
     @friendactivity_items = current_user.friendactivity.paginate(:page => params[:page])
    end
  end

  def help
  end

  def about
  end

  def contact
  end
end

Microposts Controller

class MicropostsController < ApplicationController
  before_filter :signed_in_user, :only => [:create, :destroy]
  before_filter :correct_user,   :only => :destroy

  def index
  end

  def new
   @micropost = current_user.microposts.build if signed_in?
  end

  def create
    @micropost = current_user.microposts.build(params[:micropost])
   if @micropost.save
    flash[:success] = "Micropost created!"
    redirect_to root_path
   else
    @activity_items = [ ]
    render 'new'
   end
  end

 def show
  @micropost = Micropost.find(params[:id])
  @users = @micropost.users.paginate(:page => params[:page])
 end

 def destroy
  @micropost.destroy
  redirect_to root_path
 end

  private

  def correct_user
    @micropost = current_user.microposts.find_by_id(params[:id])
    redirect_to root_path if @micropost.nil?
  end

end

Micropost Model

class Micropost < ActiveRecord::Base
  attr_accessible :content, :title
  belongs_to :user

  validates :title, :presence => true, :length => { :maximum => 100 }
  validates :content, :presence => true, :length => { :maximum => 220 }
  validates :user_id, :presence => true

  default_scope :order => 'microposts.created_at DESC'

  # Returns Microposts from the users that the given user follows
  def self.from_users_followed_by(user)
  followed_user_ids = "SELECT followed_id FROM relationships
                     WHERE follower_id = :user_id"
  where("user_id IN (#{followed_user_ids})",
      :user_id => user.id)
 end

end

I'm also adding now the routes.rb file and micropost model as requested

routes.rb

SampleApp::Application.routes.draw do
 resources :users do
  member do
   get :following, :followers
 end
end

resources :sessions, :only => [:new, :create, :destroy]
resources :microposts, :only  => [:create, :destroy, :show]
resources :relationships, :only => [:create, :destroy]

# home page route
root :to => 'static_pages#home'

# signup route
match '/signup', :to => 'users#new'
match '/signin', :to => 'sessions#new'
match '/signout', :to => 'sessions#destroy', :via => :delete

# static pages routes
match '/help', :to => 'static_pages#help'
match '/about', :to => 'static_pages#about'
match '/contact', :to => 'static_pages#contact'

# create a micropost routes
match '/createamicropost', :to => 'microposts#new'

microposts Model as requested...Thanks!

class Micropost < ActiveRecord::Base
  attr_accessible :content, :title
  belongs_to :user

  validates :title, :presence => true, :length => { :maximum => 100 }
  validates :content, :presence => true, :length => { :maximum => 220 }
  validates :user_id, :presence => true

  default_scope :order => 'microposts.created_at DESC'

  # Returns Microposts from the users that the given user follows
  def self.from_users_followed_by(user)
    followed_user_ids = "SELECT followed_id FROM relationships
                     WHERE follower_id = :user_id"
    where("user_id IN (#{followed_user_ids})",
          :user_id => user.id)
   end

end
BennyB
  • 155
  • 4
  • 19

1 Answers1

1

You are getting a routes error - No route matches [GET] "/microposts. So, it's not related with code as such. Just declare the routes to microposts like this.

config/routes.rb

resources :microposts
Community
  • 1
  • 1
Salil
  • 9,534
  • 9
  • 42
  • 56
  • Salil, I've got that in my routes.rb as...[ resources :bashmobs, :only => [:create, :destroy, :show] ] The :only restrictions don't seem to be the cause either... – BennyB Jun 02 '12 at 22:31
  • wrong app - i meant resources :microposts, :only => [:create, :destroy, :show] in the comment above. I've added the routes & microposts models as well in original post. Thanks! – BennyB Jun 02 '12 at 22:42
  • 1
    GET "/microposts" matches to :index action. So, you need to add that to :only array. It should work then. – Salil Jun 03 '12 at 07:28