基于Ajax中的实例变量动态更新页面

时间:2012-09-23 17:00:22

标签: ruby-on-rails ajax partial

更新:我的问题得到了回答,但我写了一篇博文,详细说明了我是如何做到的:http://lathamcity.com/posts/ajaxInRails.html

我有一个页面,显示基于Ruby对象的事物列表。我的目标是进行Ajax调用以获取新的Ruby对象,然后根据该对象更新列表。

我认为这样做的方法是局部的。我使用代码中的Rails实例变量使整个列表成为部分文件。然后我希望Ajax调用将相应的实例变量设置为新列表并重新呈现部分。

这是最终目标,但是现在我正在尝试做一个非常基本的版本,我只是将一个实例变量设置为字符串,然后显示字符串。

所以在我的div中,我有:

<% form_tag :action => :go , :method => :get, :remote => true  do %>
    <%= submit_tag "Go" %>
<% end %>

<div id="test"><%= render(:partial => 'test') %></div>

views/interface(我的控制器名称)文件夹中有一个_test.erb文件,只有以下行作为其内容:

<%= @test %>

然后在我的控制器中,

def go
    @test = "Hello You"
    render :update do |page|
        page.replace_html "test", :partial => "test"
    end
end

当我运行时,我得到:Missing template interface/update, application/update

我对render :update了解不多,我在谷歌的一个例子中找到了它。

导致此问题的错误是什么?我该如何解决?我是以正确的方式进行这种方式还是有更好的方法来做到这一点?

1 个答案:

答案 0 :(得分:5)

我认为在rails 3.1中已弃用/删除了render :updatereplace_html。进行部分更新的标准方法是使用js.erb模板。

在你的控制器中,告诉你的行动回应js请求:

@test = "Hello you"
respond_to do |format|
    format.js
end

创建js响应模板app / views / interface / go.js.erb:

$('#test').html("<%= escape_javascript(render('test', test: @test})) %>")

并将部分代码更改为<%= test %>,因为它不再是实例变量;相反,测试从js.erb模板传递给partial作为参数test: @test