我不确定我是否错过了一个已知的设计模式,但我一直遇到 RESTful 路由 Rails 的以下问题。
在我的示例中,我有一个可以以 javascript (:js) 格式响应的用户控制器。默认响应使用分页用户列表填充页面元素:
# /app/controllers/users_controller.rb
class UsersController < ActionController
def index
@users = User.paginate(:all, :page => params[:page], :conditions => ['name ILIKE ?', params[:name])
respond_to do |format|
format.html
format.js
end
end
end
相应的 RJS 模板如下所示:
# /app/views/users/index.js.rjs
page.replace_html :users, :partial => 'users'
这很好用,允许我对用户执行 AJAX 查找。但是,在我网站的另一部分(比如用户编辑表单),我想执行 AJAX 用户查找,但更新一组“选择”选项或执行内联自动完成,而不是更新 #users 页面元素,例如
# /app/views/users/edit.html.erb
<%= f.text_field :name %>
$('#user_name').autocomplete({url: '/users', data: 'name=value', ...})
我的问题是实现这一目标的最佳 DRY 方法是什么?我认为我不需要创建一个新的控制器操作来对应不同的视图,因为这将涉及重复查找器代码。到目前为止,我遇到的唯一解决方案是在我的 RJS 助手中构建一些 javascript 条件:
# /app/views/users/index.js.rjs
page << "if($('#users').length > 0)"
page.replace_html :users, :partial => 'users'
page << "else"
page.replace_html :user_options, :partial => 'user_options_for_select'
这对 Rails 来说感觉很脆弱,而且不干净。我是否错过了如何根据调用控制器以不同视图响应的内容?
感谢任何帮助!克里斯