This project is archived and is in readonly mode.

#6059 ✓resolved
amkirwan

render_other_test fails when wrapped in respond_to

Reported by amkirwan | November 24th, 2010 @ 06:05 PM

I am having trouble adding a new renderer to Rails 3.0.3 and when looking at the tests I find that render_simon_says in render_other_test.rb works as. However when the same test is wrapped in a respond_to the tests fail.

1) Failure:
test_using_custom_render_option(RenderOtherTest) [test/controller/render_other_test.rb:272]:
<"Simon says: foo"> expected but was
<" ">.

ActionController.add_renderer :simon do |says, options|
  self.content_type  = Mime::TEXT
  self.response_body = "Simon says: #{says}"
end   

def render_simon_says  
  respond_to do |format|
    format.simon { render :simon => "foo" }
  end
end

def test_using_custom_render_option     
  Mime::Type.register 'application/simon', :simon 
  get :render_simon_says
  assert_equal "Simon says: foo", @response.body
end

Comments and changes to this ticket

  • Neeraj Singh

    Neeraj Singh November 24th, 2010 @ 08:45 PM

    • Importance changed from “” to “Low”

    Renderers are procs which tell for which key what proc to use to render the result.

    When you wrap your code in respond_to then formats need to be matched. Since there is no format called :simon your test fails. In order to make the test pass you need to use something like Mime::Type.register "text/simon", :simon . I have not tested my code but you need to register format :simon in order for your code to work .

    Hope that helps.

  • amkirwan

    amkirwan November 25th, 2010 @ 03:02 AM

    I could be missing something about the way this should work in Rails 3 but in my test_using_custom_reneder_option in the code above I have a Mime::Type.register but the code does not work. I mistakenly put Mime::Type.register 'application/simon', :simon in the code above but it also fails when using Mime::Type.register 'text/simon', :simon. If the MIME type isn't registered then the test will error with:

      1) Error:
    test_using_custom_render_option(RenderOtherTest):
    NameError: uninitialized constant Mime::SIMON
    

    but if the MIME type :simon is registered like in my code in the original post then the test fails:

      1) Failure:
    test_using_custom_render_option(RenderOtherTest) [test/controller/render_other_test.rb:273]:
    <"Simon says: foo"> expected but was
    <" ">.
    

    It seems as though for a custom MIME type when put within a respond_to then the block associated with the custom render is never called.

    ActionController.add_renderer :simon do |says, options|
      self.content_type  = Mime::TEXT
      self.response_body = "Simon says: #{says}"
    end
    

    I've been stepping through the render code to see if I can find where the problem is. I've gotten to the point where I see that calling format.simon will create a new instance method simon in the class ActionController::MimeResponds::Collector using method_missing of the AbstractController::Collector module. It seems as though the &block of this method is never called which is why the custom render doesn't work in respond_to.

  • Neeraj Singh

    Neeraj Singh December 1st, 2010 @ 05:35 AM

    • State changed from “new” to “resolved”

    In order to make the test pass this is what you need to do

      def test_using_custom_render_option
         Mime::Type.register 'text/simon', :simon
        get :render_simon_says, :format => :simon
        assert_equal "Simon says: foo", @response.body
      end
    
        def render_simon_says
          respond_to do |format|
           format.simon { render :simon => "foo" }
          end
        end
    

    Hope that helps.

Create your profile

Help contribute to this project by taking a few moments to create your personal profile. Create your profile »

<h2 style="font-size: 14px">Tickets have moved to Github</h2>

The new ticket tracker is available at <a href="https://github.com/rails/rails/issues">https://github.com/rails/rails/issues</a>

People watching this ticket

Pages