Rails - Simple Search from Railscast Not Displaying

102 views Asked by At

i've been following the railscast tutorial on how to create a simple search form, for some odd reason, whenever I search the URL changes and the server log shows that it searches for the post, in this case an ad, but it doesnt display it.

My Ad Controller.

class AdsController < ApplicationController
  before_action :set_ad, only: [:show, :edit, :update, :destroy]


  # GET /ads
  # GET /ads.json
  def index
    @ads = Ad.search(params[:search])
    @ads_small = Ad.where(:size => "small").order('created_at DESC')
    @ads_medium = Ad.where(:size => "medium").order('created_at DESC')
    @ads_featured = Ad.where(:size => "featured").order('created_at DESC')

  end

  # GET /ads/1
  # GET /ads/1.json
  def show
  end

  # GET /ads/new
  def new
    @ad = Ad.new
  end

  # GET /ads/1/edit
  def edit
  end

  # POST /ads
  # POST /ads.json
  def create
    @ad = Ad.new(ad_params)
    @ad.user_id = current_user.id

    respond_to do |format|
      if @ad.save
        format.html { redirect_to @ad, notice: 'Ad was successfully created.' }
        format.json { render action: 'show', status: :created, location: @ad }
      else
        format.html { render action: 'new' }
        format.json { render json: @ad.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /ads/1
  # PATCH/PUT /ads/1.json
  def update
    respond_to do |format|
      if @ad.update(ad_params)
        format.html { redirect_to @ad, notice: 'Ad was successfully updated.' }
        format.json { head :no_content }
      else
        format.html { render action: 'edit' }
        format.json { render json: @ad.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /ads/1
  # DELETE /ads/1.json
  def destroy
      @ad.destroy
      respond_to do |format|
        format.html { redirect_to ads_url }
        format.json { head :no_content }
      end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_ad
      @ad = Ad.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def ad_params
      params.require(:ad).permit(:title, :url, :preview, :location, :size, :info, :search)
    end
end

My Ad Model

class Ad < ActiveRecord::Base

    attr_accessible :title, :url, :preview, :size, :location, :info
    belongs_to :user
  has_attached_file :preview, :default_url => "missing.jpg", :styles => { :medium => "125x125^", :featured => "250x250^", :showpg => "400x400^" }, :convert_options => {:medium => "-gravity center -extent 125x125", :featured => "-gravity center -extent 250x250", :showpg => "-gravity center -extent 400x400"}

  validates :title, length: { maximum: 35 }
  validates :url, length: { maximum: 40 }

  def self.search(search)
  if search
    find(:all, :conditions => ['title LIKE ?', "#{search}"])
  else
    find(:all)
  end
end
end

My Ad Index View

 <%= form_tag ads_path, :method => :get do %>
  <p class="search_f">
    <%= text_field_tag :search, params[:search], :class => "glow_f" %>
    <%= submit_tag "Search", :name => nil, :class => "submit" %>
<% end %>

<% @ads.each do |ad| %>
<% if ad.size == "featured" %>
  <div class="adspace_grid_f">
    <div class="pic_sec_f">
      <%= image_tag ad.preview.url(:featured) %>
    </div>
    <div class="text_info_f">
      <span class="bold"><%= link_to ad.title, ad, :class => "title" %></span></br>
      <p><%= truncate(ad.info, length: 90) %></p>
      <span class="bold"><%= ad.location %></span></br>
      <span class="bold"><%= ad.url %></span>

    </div>
    <% if can? :destroy, ad %>
      <%= link_to 'Delete', ad, :method => :delete, :class => "delete" %> 
    <% end %>
  </div> 
<% end %>
<% if ad.size == "medium" %>
  <div class="adspace_grid">
    <div class="pic_sec">
      <%= image_tag ad.preview.url(:medium) %>
    </div>
    <div class="text_info">
      <span class="bold"><%= link_to ad.title, ad, :class => "title" %></span></br>
      <p><%= truncate(ad.info, length: 60) %></p>
      <span class="bold"><%= ad.location %></span></br>
      <span class="bold"><%= ad.url %></span>

    </div>
    <% if can? :destroy, ad %>
      <%= link_to 'Delete', ad, :method => :delete, :class => "delete" %> 
    <% end %>
  </div> 
<% end %>
<% end %>

Any help would be greatly appreciated.

1

There are 1 answers

4
cschroed On BEST ANSWER

Check the ad.size for the ads that qualify for your search. If the size isn't "featured" or "medium" it looks like your view will ignore it since the only if-conditions are for ad.size == "featured" and ad.size == "medium".

If you want to see what is being found by the search, include this line above the <% @ads.each do |ad| %> line:

<% @ads.inspect %>

Also, @ads_small, @ads_medium, and @ads_featured don't appear to be used anywhere. Are those for a future purpose?