首先:抱歉问题措辞,我真的试图找到最好的配方。其他“如何跨控制器渲染”或“如何服务器重定向”
第二:我的代码示例在语法上是错误的但是我试图弄清楚我的概率是什么,而不会充斥你的代码
这种情况原则上是经典的:
我有一本书的页面上有句子。所以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个请求只是一个好东西。因为剩下的 - 周围环境很干净
答案 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]
已完成隐含,在这种情况下不会被解雇。