Ruby on Rails y cómo renderizar parcialmente usando json y jquery

Ruby on Rails newbie whose confused and frustrated :) I've spent over a day on this and think I've probably just confused myself.

Basically, I'm trying to render a partial in a view. Here's what I have specifically: A form with 2 basic fields: Category and SubCategory. SubCategory changes depending on what the user selected in Category. I'm using "JQuery" with the assets pipeline enabled. This part works:

          id_value_string = $(@).val()
          if id_value_string == ""
            # if the id is empty remove all the sub_selection options from being selectable     and do not do any ajax
            $("select#contact_info_subcategory_id option").remove()
            row = "" + "" + ""
            # Send the request and update sub category dropdown
            tmp = '/subcategories/for_categoryid/' + id_value_string + '.json'
            type: 'GET',
            dataType: 'json',
            url: tmp,
            timeout: 2000,
            error: (XMLHttpRequest, errorTextStatus, error) -> alert "Failed to submit : " + errorTextStatus + " ;" + error,
              success: (data) ->
                # Clear all options from sub category select
                $("select#contact_info_subcategory_id option").remove()
                # put in a empty default line
                row = "" + "" + ""
                # Fill sub category select
                $.each(data, (i, j) ->
                  row = "" + + ""

It generates a json response correctly.

When the form loads, in addition to Category and SubCategory, I also have 2 text fields - previous_value and current_value; however, if SubCategory == "Full" then I hide previous_value and current_value and need to insert a partial with new fields.

I'm having no problem hiding previous_value and current_value fields with JQuery works and looks like this (this is inserted into the code above):

    id_text_string = $("#contact_info_subcategory_id option:selected").text()
    if id_text_string == "Full"

I created a div called "test" in my form where I want to insert the new fields if SubCategory is "Full" and of course, inserting this line into the doesn't work:

  $('#test').html('<%= escape_javascript render("contact_infos/_full_name_info") %>')

as all I get on the page is the string "<%= escape_javascript render("contact_infos/_full_name_info") %>"

I've tried the following but can't get any to work:
1. creating a new.json.erb file with the following code:

<% self.formats = ["html"] %>
      test = {
        "html":"<%= raw escape_javascript(render :partial =>     'contact_infos/full_name_info',
                    :content_type => 'text/html')} 

This json file never triggered. My controller has this line:

format.json { render json: @contact_info }

Is this the best way to do this? If yes, what can I try next?

2. I saw a posting yesterday (I can't find it now - was on another computer) about creating a javascript variable (I called it fullnamefield) in the application.html.erb layout file as well as adding the js variable to the new.html.erb view, which I did. I also added this line to the


and it worked!! EXCEPT that then when I went to any other area of the site, I got an error.
3. As a workaround, I thought about trying to change the json that my jquery produces to a js and then trying to trigger the new.js.erb. I ran into trouble trying to convert the ajax call. I could create "json" and also "text" dataTypes but not script (not sure why).

So... any ideas/help? I've really been searching and I'm frustrated enough that I'm considering just creating all the fields and hidings/showing them as needed from JQuery, which would be so simple to implement but is just wrong.

UPDATE: Attempt 4 (or is it 40?):

What you wrote got me thinking... I think I'm close but not there yet.

In my _form.html.erb, I added to the Subcategory field data-remote, data-url and data-type:

<div class="field">
      <%= f.label :category_id %>
      <%= collection_select(:contact_info, :category_id, Category.all, :id, :name, options ={:prompt => "--Select a Category--"}) %>
    <div class="field">
      <%= f.label :subcategory_id %>
      <%= collection_select(:contact_info, :subcategory_id, Subcategory.find_all_by_category_id(@contact_info.category_id), :id, :name, options ={:prompt => "--Select a SubCategory"}, "data-remote" => true, "data-url" => "/contact_infos/get_full_fields", "data-type" => :json ) %>

Then in the contact_infos_controller.rb I added:

def get_full_fields
    @full_name =
    respond_to do |format|

In my routes.rb I modified contact_infos by adding collection do...

    resources :contact_infos do
        collection do
          get 'get_full_fields'

I created contact_infos\get_full_fields.js.erb:

var full_fields_form = $('<%= j(render(:partial => "contact_infos/full_name_info"))%>');

Now when I test this in the browser with debugger and change SubCategory to "Full" I can see that it runs correctly (I think) in that I'm getting this back:

Request URL:http://localhost:3000/contact_infos/get_full_fields?contact_info%5Bsubcategory_id%5D=3 Request Method:GET Status Code:200 OK

The "Type" is showing up as "text/javascript." The Response tab is just showing the javascript code but nothing is happening/triggering. Even when I place just a


in the js file nothing happens.

Cualquier idea por qué?

preguntado el 12 de junio de 12 a las 09:06

OK - I finally got it working. I used solution #4 above with one minor change: In the contact_infos_form.html.erb, I had specified the Subcategory field as: <%= collection_select(:contact_info, :subcategory_id, Subcategory.find_all_by_category_id(@contact_info.category_id), :id, :name, options ={:prompt => "--Select a SubCategory"}, "data-remote" => true, "data-url" => "/contact_infos/get_full_fields", "data-type" => :json ) %> Once I changed the "data-type" from :json to :script IT WORKED! -

1 Respuestas

Why not do it the same way you get subcategory data? Create a view containing the partial (and corresponding controller action) and call it via ajax when you want to display that content.

Respondido el 12 de junio de 12 a las 14:06

Hi - thanks for the response. I'm afraid I'm going to need more details than that. I pensar I already tried that (#1 above, where I created a new.json.erb) and I couldn't get the json to trigger. :( - arroz morado

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.