2010-11-18 54 views
0

我遇到了远程执行操作和第一次单击链接时不更新的部分问题。第一次点击时部分未更新

的视图中(部分名为books)我创建一个链接:在routes.rb中 还有一个条件在读这本书,使显示不同的文本被定义

link_to "⊗", read_book_path(book), :remote => true 

read_book_path

在我的控制,我已经定义了一个新的动作:

def read 
    @books = Book.all 
    @book = Book.find(params[:id]) 
    @book.read = [email protected] 
    @book.save 
    respond_to do |format| 
    format.html { redirect_to(books_url) } 
    format.js {render :layout => false, :locals => { :book => @book } } 
    end 
end 

这意味着我需要一个文件read.js.erb,这个文件的内容是:

$("#books").empty().html("<%= escape_javascript(render(:partial => "books")) %>"); 

当我点击链接,我可以在终端窗口中看到数据库字段已更新,但部分不是。点击相同的链接再次更新部分。

将链接更改为:remote => false也可以,但页面会重新加载(如预期的那样)。

我试图用Safari和Developer工具调试它,当我第一次点击链接时,我可以看到服务器的响应。 这里有什么不对,由<%= escape_javascript(render(:partial => "books")) %>生成的HTML包含错误的HTML与部分的旧内容。只有第二次或第三次点击才会显示更新后的HTML。

我已经集成了jquery-ujs - 是部分不会第一次更新的原因还是我缺少其他东西?

这真的让我头痛,你能帮我吗?

编辑: 如果有帮助:我在application.js中创建了一个到ajax:beforeajax:complete的监听器。第一个显示一个微调,第二个隐藏它。 当我点击链接时,微调器显示,但它不隐藏。

回答

1

它看起来像你有一个订购问题,造成麻烦。您将一整套书籍捕获到@books变量中,然后修改单独一本书的单独副本。此更改不会传回。

# Load and modify the one book by flipping the flag 
@book = Book.find(params[:id]) 
@book.read = [email protected] 
@book.save 

# Load all books 
@books = Book.all 

作为一个说明,这是做事的一个极其低效的方式,所以我希望你不工作了大量的数据。您可能会发现它更容易通过简单地用一个简单的查询UPDATE拨动一个领域做到这一点:

Book.update_all({ :read => true }, { :id => params[:id] }) 

我不知道为什么你打电话$(...).empty().html(...),而不是简单地$(...).html(...)因为html()方法应该取代HTML批发,无需提前清除。

一两件事,可能有助于使用.js.rjs其中相当于将是:

page[:books].replace_html(:partial => 'books') 

凭借简单的JavaScript,RJS让您消除了很多琐事。你可以在RJS使用JS以及对于情况下,有没有相应的:

page << '$("#books").empty()' 
page[:books].replace_html(:partial => 'books') 

为了使这更Rails的友好,你可以打电话给你的部分_book这将使局部变量是多余的。每个部分都有一个默认变量,其名称与模板名称相匹配:

render(:partial => 'book', :collection => @books) 
+0

谢谢您的回答。改变顺序解决了我的问题。 :) 我想要做的是某种开关,点击一个“读”书将其标记为“未读”,反之亦然。 因此,我正在读取当前值,将其反转并保存。我找不到更好的方法。 – dmnkhhn 2010-11-19 00:21:24

相关问题