0

Ruby on Rails 新手感到困惑和沮丧:) 我在这上面花了一天多的时间,并认为我可能只是让自己感到困惑。

基本上,我试图在视图中渲染一个部分。以下是我的具体内容:一个包含 2 个基本字段的表单:Category 和 SubCategory。SubCategory 会根据用户在 Category 中选择的内容而变化。我正在使用启用了资产管道的“JQuery”。这部分工作:

 
    contact_infos.js.coffee

    jQuery(document).ready(->
        $("select#contact_info_category_id").change(->
          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 = "" + "" + ""
            $(row).appendTo("select#contact_info_subcategory_id")
          else
            # Send the request and update sub category dropdown
            tmp = '/subcategories/for_categoryid/' + id_value_string + '.json'
          $.ajax(
            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 = "" + "" + ""
                $(row).appendTo("select#contact_info_subcategory_id")
                # Fill sub category select
                $.each(data, (i, j) ->
                  row = "" + j.name + ""
                  $(row).appendTo("select#contact_info_subcategory_id")
                )
          )
        )
      )
    

它会正确生成 json 响应。

当表单加载时,除了 Category 和 SubCategory,我还有 2 个文本字段——previous_value 和 current_value;但是,如果 SubCategory == "Full" 那么我隐藏 previous_value 和 current_value 并需要插入一个带有新字段的部分。

我使用 JQuery 隐藏 previous_value 和 current_value 字段没有问题,看起来像这样(这被插入到上面的代码中):

$("select#contact_info_subcategory_id").change(->
    id_text_string = $("#contact_info_subcategory_id option:selected").text()
    if id_text_string == "Full"
      $('#contact_info_previous_value_id').hide()
      $('#contact_info_current_value_id').hide()
    else
      $('#contact_info_previous_value_id').show()
      $('#contact_info_current_value_id').show()
  )

我在表单中创建了一个名为“test”的 div,如果 SubCategory 为“Full”,我想在其中插入新字段,当然,将此行插入 contact_infos.js.coffee 不起作用:

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

因为我在页面上得到的只是字符串 "<%= escape_javascript render("contact_infos/_full_name_info") %>"

我尝试了以下但无法正常工作:
1. 使用以下代码创建一个 new.json.erb 文件:

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

此 json 文件从未触发。我的控制器有这条线:

format.json { render json: @contact_info }

这是最好的方法吗?如果是,接下来我可以尝试什么?


2. 我昨天看到了一个帖子(我现在找不到 - 在另一台计算机上)关于在 application.html.erb 布局文件中创建一个 javascript 变量(我称之为 fullnamefield)以及将 js 变量添加到new.html.erb 视图,我这样做了。我还在contacts_infos.js.coffee 中添加了这一行:

('#test').html(fullnamefield) 

它奏效了!!除了当我去网站的任何其他区域时,我得到了一个错误。
3. 作为一种解决方法,我想过尝试将我的 jquery 生成的 json 更改为 js,然后尝试触发 new.js.erb。我在尝试转换 ajax 调用时遇到了麻烦。我可以创建“json”和“text”数据类型,但不能创建脚本(不知道为什么)。

所以...任何想法/帮助?我真的一直在搜索,我很沮丧,以至于我正在考虑从 JQuery 中创建所有字段并根据需要隐藏/显示它们,这实现起来非常简单,但只是错误的。

更新:尝试4(或者是40?):

你写的让我思考......我想我已经接近了,但还没有。

在我的 _form.html.erb 中,我添加到子类别字段 data-remote、data-url 和 data-type:

<div class="field">
      <%= f.label :category_id %>
      <br/>
      <%= collection_select(:contact_info, :category_id, Category.all, :id, :name, options ={:prompt => "--Select a Category--"}) %>
    </div>
    <div class="field">
      <%= f.label :subcategory_id %>
      <br/>
      <%= 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 ) %>
    </div>

然后在contact_infos_controller.rb中我添加了:

def get_full_fields
    @full_name = FullName.new
    respond_to do |format|
      format.js
    end
  end

在我的 routes.rb 中,我通过添加 collection do 修改了 contact_infos ...

    resources :contact_infos do
        collection do
          get 'get_full_fields'
        end
      end

我创建了contact_infos\get_full_fields.js.erb:

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

现在,当我使用调试器在浏览器中测试它并将 SubCategory 更改为“Full”时,我可以看到它运行正确(我认为),因为我得到了这个:

请求网址:http://localhost:3000/contact_infos/get_full_fields?contact_info%5Bsubcategory_id%5D=3 请求方法:GET 状态码:200 OK

“类型”显示为“文本/javascript”。响应选项卡仅显示 javascript 代码,但没有发生/触发。即使我只放置一个

alert('hello');

在 js 文件中没有任何反应。

任何想法为什么?

4

1 回答 1

0

为什么不采用与获取子类别数据相同的方式呢?创建一个包含部分(和相应的控制器操作)的视图,并在您想要显示该内容时通过 ajax 调用它。

于 2012-06-12T09:32:22.450 回答