【发布时间】:2017-02-18 14:00:57
【问题描述】:
最近几天我一直在尝试了解 AJAX on rails 的不同方面。在阅读了一些介绍之后,我设法了解了 rails 内置的 UJS 功能。我编写的一个小玩具应用程序的示例,我想在其中介绍一些 AJAX 功能...
控制器动作如下所示
class ExpenseListsController < ApplicationController
before_action :require_authentication
...
def create
@expense_list = ExpenseList.new(expense_list_params)
if @expense_list.save
respond_to do |format|
format.html do
flash[:success] = 'Created!'
render :show
end
format.js
end
else
respond_to do |format|
format.html do
@errors = @expense_list.errors
flash[:danger] = 'Something went wrong!'
render :new
end
format.js
end
end
end
...
end
在我看来,我通过 remote: true 选项调用操作
各自的create.js.erb 看起来像这样
var form_field = $('.expense_lists_form');
var expenseLists = $('#expense-lists');
expenseLists.append("<%= j render @expense_list %>");
form_field.slideUp(200);
@expense_list 的模板如下所示
.col-xs-12.col-lg-3.col-md-4{id: "expense_list_#{expense_list.id}"}
.panel.panel-default
.panel-heading
= link_to expense_list.name, expense_list_path(expense_list)
.panel-body
.links
= link_to 'Modify list', edit_expense_list_path(expense_list), remote: true
= link_to 'Delete list', expense_list_path(expense_list), method: 'delete', remote: true
.description
%p
- if expense_list.description.present?
= expense_list.description
- else
%i
No description supplied, add one
=link_to 'here', edit_expense_list_path(expense_list)
.email-notification.text-muted
(Email notifications enabled)
.panel-footer
= "Expenses in #{current_month_name}:"
%b
= "#{expense_list.sum_of_exp_in_month(current_month, current_year)}€"
= "(#{expense_list.euros_left_in_month(current_month, current_year)}€ left)" if expense_list.budget_in_euro
它有效,但对我来说,这个想法似乎有一些缺点:
- 通过额外的 *.js.erb 文件使我的文件结构膨胀
- 扭曲了 JS 和代码库其余部分的物理分离
- 当我使用 HAML 时,它引入了一种新的编码风格 (ERB)
现在我有两个问题:
每个教程(我到目前为止看到的)似乎都在推广这种在 Rails 中处理 AJAX 响应的解决方案:为什么?当我检查其他更大的 Rails 项目(例如 Diaspora)的代码时,我似乎没有发现他们这样做 - 他们中的大多数似乎通过
$.ajax({ ... })在纯 JS/jQuery 中处理它。那么 Rails 内部 UJS 方法的主要优势是什么?如果出于某种原因更喜欢使用 Rails UJS 方式:您如何组织代码?为
*.js.erb-files 创建额外的目录?将所有这些内容传输到位于我的
/app/assets/javascript目录中的纯javascript 文件并在那里处理jQuery 中的AJAX 请求是一个好的做法?为了响应 HTML 的适当部分以通过 JS 更新 DOM,我的控制器响应应该是什么样子?换句话说:我怎样才能用纯 Javascript/jQuery 处理的部分响应?
提前致谢! 安迪
【问题讨论】:
标签: javascript jquery ruby-on-rails ajax ruby-on-rails-4