JB Juliano
JB Juliano

Reputation: 632

respond_to only format.js for all mime types

I have a controller which respond_to format.js, however, most request assume the old format.html still exists and throws a 404 exception. How do I capture all MIME request on the controller and redirect them only to format.js?

Here's the current controller action

def search
  respond_to do |format|
    unless @search.nil?
      format.js { render :partial => '/search/search_form', :status => 200 }
    else
      format.js { render :partial => '/search/not_exist', :status => 500 }
    end
  end
end

I'm trying to do something like this, (I know this is invalid, just for demonstration).

def search
  respond_to(:html) do |format|
    unless @search.nil?
      format.js { render :partial => '/search/search_form', :status => 200 }
    else
      format.js { render :partial => '/search/not_exist', :status => 500 }
    end
  end
end

Upvotes: 4

Views: 2384

Answers (2)

DGM
DGM

Reputation: 26979

If all requests should only be js, just take out the whole respond_to structure:

def search
  unless @search.nil?
    render :partial => '/search/search_form', :status => 200
  else
    render :partial => '/search/not_exist', :status => 422
  end
end

(note: change to 422 unprocessable entity to indicate a semantic problem with the submission. 500 is usually reserved for server errors, as in, crashes, stack dumps, etc)

Upvotes: 3

Paul Kaplan
Paul Kaplan

Reputation: 2885

You can plug in a permanent redirect to your format.html and loop it back to the controller using the format you want. This is the way that you would redirect, say, an RSS feed to an atom feed or something where you may have multiple input formats, but only one output format

respond_to do |format|
...
format.js { do whatever }
...
format.html { redirect_to path_back_here(:format => :js) }

Replacing path_back_here with whatever path you are using ( search_path? )

Upvotes: 2

Related Questions