好的,使用了稍微不同的方法,但问题解决了。
注意:我必须使用wireshark才能看到rails发送到移动设备的到底是什么,因为移动浏览器上没有firebug....当查看发送回浏览器的数据时,解决方案变得清晰,我看到响应包括应用程序布局,而我期望只接收 json 字符串。
1)用于调用控制器动作的jqm形式的按钮是:
<div class="ui-block-c">
<%= link_to "compute", '#', class: 'compute-myval',:"data-role" => "button", :"data-ajax" => false %>
</div>
2)控制器动作将结果保存在实例变量和respond_to json中(控制器名称是“visits_controller”,控制器动作是“计算”)
@total = "value returned from web service"
...
respond_to do |format|
format.js #used for HTML views
format.json
end
3)有一个视图名为
app/views/visits/compute.json.erb
其内容是
{ "total": "<%= @total %>" }
4)按下按钮时执行的jquery代码是
$('form').on('click', '.compute-myval', function(event) {
var url;
url='/visit/compute';
url += '/' + $('#visit_field1').val();
url += '/' + $('#visit_field2').val();
url += '/' + $('#visit_field3').val();
$.ajax( {
url: url,
data: $(this).serialize(),
success: function (mydata) {
$('#visit_resultfield').val(mydata.total);
},
dataType: 'json'
});
return event.preventDefault();
});
5) 要管理 :mobile 格式,我使用 Mobylette gem。为了避免通过 Ajax 触发的控制器操作使用移动格式并且应用了 application.mobile.erb 模板,我必须为 Mobylette 设置几个配置(在 application_controller.rb 内)
include Mobylette::RespondToMobileRequests
mobylette_config do |config|
config[:skip_xhr_requests] = false
config[:fallback_chains] = { mobile: [:mobile, :html, :json] }
end
需要的另一件事是在 app/layouts 下有一个名为 application.json.erb 的文件,该文件仅包含一行
<%= yield %>
所以它可以工作,因为没有 compute.mobile.erb 视图,后备是 :json 并且模板没有添加任何东西
6)rails日志中的输出是
Started GET "/visit/compute/3/78/66" for 192.168.1.7 at 2012-12-22 00:13:35 +0100
Processing by VisitsController#compute as JSON
Parameters: {"field1"=>"3", "field2"=>"78", "field3"=>"66"}
Rendered visits/compute.json.erb within layouts/application (0.1ms)
Completed 200 OK in 1335ms (Views: 5.4ms | ActiveRecord: 1.0ms)
7)Jqm表格中的“resultfield”字段填写总值。
任务完成...