【问题标题】:Performing AJAX calls on the "new" controller在“新”控制器上执行 AJAX 调用
【发布时间】:2011-02-28 10:15:02
【问题描述】:

在我的 rails 应用程序中,我希望将可排序列表作为对象创建的一部分。 Railscast 中建议的最佳做法是添加 acts_as_list 插件,然后启动 AJAX 调用以更新项目位置。但是,AJAX 调用在未保存的模型上不起作用,new 就是这种情况。

一种解决方案是立即将模型保存到 new 并重定向到 edit。这将有一个很好的副作用,即持久化任何更改,以便用户在被打断时可以恢复工作。

但是,此解决方案增加了保存无效模型的不必要的复杂性,损害了 rails 的验证过程。有没有更好的方法来允许 AJAX + 验证而无需进行太多工作?

【问题讨论】:

    标签: ruby-on-rails ajax


    【解决方案1】:

    您的操作与任何其他操作具有相同的参数访问权限。您可以将未保存对象的参数传递回 new 操作,并且可以将具有属性集的对象 re-initialized 返回给视图。例如:

    控制者:

    class WidgetsController < ApplicationController
      def new
        @widget = params.has_key?(:widget) ? Widget.new(params[:widget]) : Widget.new
      end
      ..
    end
    

    然后在您看来,您必须通过链接或表单帖子将参数发送到新操作。

    【讨论】:

    • 只是为了确保我理解:在我对“new”进行 AJAX 调用之后,我是否必须运行某种 JS 逻辑来更新页面?它会比实现“位置”属性的客户端缓存更简单吗?
    • 不一定,RJS 可以为您处理。例如,如果您使用 link_to_remote,并将要更新的 DOM ID 传递给 :update 选项,则从新操作返回的任何内容都将放置在页面上具有该 DOM ID 的元素中。
    【解决方案2】:

    您可以将未保存的对象临时存储在“会话”中。

    like(此代码必须在控制器中)

    my_model = MyModel.new(params[:my_model])
    session[:my_model_tmp] = my_model
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-02
      • 1970-01-01
      • 1970-01-01
      • 2018-04-19
      • 2021-10-05
      • 1970-01-01
      • 2018-10-08
      相关资源
      最近更新 更多