如何组合/快捷两个(ajax)请求,如果第一个是好的话,渲染第二个服务器端 - 在rails中?

时间:2015-08-10 20:49:06

标签: ruby-on-rails-3

首先:抱歉问题措辞,我真的试图找到最好的配方。其他“如何跨控制器渲染”或“如何服务器重定向”

第二:我的代码示例在语法上是错误的但是我试图弄清楚我的概率是什么,而不会充斥你的代码

这种情况原则上是经典的:

我有一本书的页面上有句子。所以3个控制器(3个型号) - 我有更多,但那不是重点

所有精彩的RESTfull& MVC“符合”

现在编辑页面进入,可以通过AJAX编辑你的书

在这种情况下(我认为)这样的请求/代码也是一个标准

sentence_edited:
    $ajax("update sentence")
    if ok
        $ajax("get book content HTML")
        if ok
            change_book_html   
    else
        error_handling  

和(等等)

word_edited:
    $ajax("update word")
    if ok
        $ajax("get book content HTML")
        if ok
            change_book_html   
    else
        error_handling  

由于所有这些工作正常,我想摆脱第二次ajax reuest加倍RTT和服务器端安全检查,以及其他东西

我想要的是:

sentence_edited:
    $ajax("update sentence if ok get book content HTML")
    if ok
        change_book_html   
    else
        error_handling  

所以我做的是介绍一个Edit(sub)Controller,所以我有

BookController < EditController < ApplicationController
SentenceController < EditController < ApplicationController
WordController < EditController < ApplicationController

class EditController < ApplicationController
    before_filter do
        @inmplicite_redir=params.delete(:gimme_book) 
    end

#and - and thats the point where I got stuck:

    def render(*args, &block)
         if @inmplicite_redir
             # yes what?
         end
         super
    end
end

因为只渲染其他控制器/操作render controller:book action: bookhtml会呈现视图,如名称所示,但不会调用操作

所以在上面的“#yes what”部分我需要像

这样的东西
    def render(*args, &block)
         if @inmplicite_redir
             params.clear.merge  @inmplicite_redir
             BooksController.new.get_html
         end
         super
    end

但是这不起作用,即使它起作用,它不仅有气味,而且很臭 - 我认为

我不在乎解决方案是不是非常舒适和干净,因为没有2个请求只是一个好东西。因为剩下的 - 周围环境很干净

1 个答案:

答案 0 :(得分:0)

想想Ruby! 制作一个模块。

由于编辑器渲染不符合标准控制器的行为,我已经为Module

制作了get_book_html

我唯一要做的就是将include BookEditor行从BooksController移动到EditController,这样所有控制器都可以呈现book_html。

所以最终看起来像这样

class EditController < ApplicationController
    include BookEditor

    before_filter do
        #remember book_id and clean params
        @implicite_redir=params.delete(:gimme_book) 
    end

    def render(*args, &block)
        #just if there was a book_id override standard behaviour
        if @implicite_redir
            book_id=@implicite_redir
            #remove book_id (or yo will never get an anwser ...)
            @implicite_redir=false
            get_book_html(book_id)  
         end
         super
    end
end

BookController < EditController < ApplicationController
SentenceController < EditController < ApplicationController
WordController < EditController < ApplicationController

在编辑中明确安全检查book_id ,因为before_filter BooksController中的for (int i = 0; i < original.length; i++) reversal[reversal.length - 1 - i] = original[i] 已完成隐含,在这种情况下不会被解雇。