javascript - Rails - 多个远程表单点击相同的 Controller 操作?

标签 javascript ruby-on-rails

我正在开发一个应用程序,其中使用远程表单从多个不同位置更新某个模型。我正在寻找一种模式来在更新此模型后动态调用正确的 JS 回调。

对于普通表单,可以通过在表单本身中传递重定向 url,然后在 Controller 中重定向到此 url 来解决此问题。远程表单端更难:我应该传递文件名吗?我应该传递任意字符串,然后在单个 .js.erb 文件中打开该字符串吗?还有其他建议吗?

这是否只是一个迹象,表明应重组应用程序以防止从多个位置更新同一模型?

最佳答案

不,如果您可以从不同位置调用相同的 Controller 操作,那就没问题。

您的选择:

1) 优选地,该 Controller 操作可以给出相同的响应并且适用于不同的位置,例如。它只是更新一个带有 id 的容器,该 id 存在于所有这些位置。

2) 您注意到重定向使过去的事情变得简单,请考虑将以下内容添加到您的应用程序 Controller 中:

def js_redirect_to(path, flash_messages = {})
  flash_messages.each { |type, message| flash[type] = message }

  respond_to do |format|
    format.js { render :js => "window.top.location='#{path}';" }
  end
end

这与普通的redirect_to签名相同,它只是允许你从js请求重定向。请注意,如果您使用 Turbolinks,则 js 应为“Turbolinks.visit(url);”。

3) 如果你确实不能像上面的选项一样一般地处理它,你可以传递你在表单中提交的位置的 JS 命名空间,并且 Controller 对所有位置调用相同的方法,这只是一个不同的命名空间。例如:

假设一个位置来自宠物管理,然后在 Assets pet.js 中:

var pet = {
  load = function() {
    your page load js...
  },

  ... more functions...

  post_callback = function(html_segment1, html_segment2) {
    this is where you handle the form callback for pets...
    $('some_element').html(html_segment1);
    $('another_element').html(html_segment2);
  }
}

为应用的其他位置构建更多类似的内容。无论如何,使用这样的 JS 命名空间是个好主意。然后您的表单向 Controller 提交一个参数 :location => :pet , Controller 响应:

... your JS code that all pages should execute...
html_segment1 = "<%= escape_javascript(render 'some_partial') %>";
html_segment2 = "<%= escape_javascript(render 'other_partial') %>";
<%= @location %>.post_callback(html_segment1, html_segment2);

4)使用widget gem,最流行的是apotomocells .

5) 只需在 Controller 中使用一个 case 即可渲染不同的 View 。

希望这对您有所帮助,如果您需要澄清,请告诉我。

关于javascript - Rails - 多个远程表单点击相同的 Controller 操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22183600/

相关文章:

ruby-on-rails - 如何使 named_scope 与连接表一起正常工作?

ruby-on-rails - 生成唯一的顺序 id

ruby-on-rails - 如何准备生产网站中的数据丢失?

javascript - .attr() 返回属性名称

javascript - 圆近似,是具有 N 个 Angular 的正多边形

javascript - 使用 JavaScript 获取所选下拉项的值的正确方法是什么?

ruby-on-rails - 如何在 Rails 3 中并行使用 Mongoid 和 ActiveRecord?

ruby-on-rails - ActionMailer:使用多个自签名证书

javascript - 如何将带有所需位置标记的 map 存储在文件中?

javascript - 第二次单击后触发 knockout 单击绑定(bind)