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 文件中没有任何反应。
任何想法为什么?