0

我目前正在尝试重构一些遗留代码。它目前是这样的:

控制器

def create
  # do stuff

  respond_to do |format|
    format.html { do stuff }
    format.js { render partial: 'stage_two', locals: { some instance variables } }
  end
end

然后在views/controller_name/_stage_two.js.erb里面:

$('.some_element').children().fadeOut( function() {
  $('.some_element').children().remove();
  $('.some_element').html("<%=j render partial: 'form', locals: { stuff } %>");
  $('.some_element .stage_two').fadeIn();
});

所以基本上控制器动作本质上是渲染javascript。而那个特定的 javascript 只是从页面中删除一个元素,更改内容,然后将其淡入。有没有更好的方法来做到这一点?我知道通常 javascript 位于app/assets/javascripts.

4

2 回答 2

1

您当前的实现已经非常干燥并且是标准方式。

html 请求也应该呈现相同的部分但具有布局。

js 请求应该渲染 js 响应(渲染部分)并更新页面的一部分。

我知道通常 javascript 位于 app/assets/javascripts 中。

这些是您的资产,这stage_two.js.erb不是您的资产文件,而是您对 js 响应的操作处理。

绝对对于较小的更新操作,您可以使用 json 请求并接收 json 响应来更新视图,但是对于许多失败的情况(尤其是处理大数据时),并且您当前的实现很好......

于 2013-01-20T08:22:47.060 回答
0

通常,执行此操作的常用方法是让控制器返回 JSON(我会让它呈现变量的格式化版本),然后让 JS 执行正常的 AJAX 调用并使用 JSON 数据更新元素。

于 2013-01-20T08:16:19.657 回答