1

我不确定我是否错过了一个已知的设计模式,但我一直遇到 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 来说感觉很脆弱,而且不干净。我是否错过了如何根据调用控制器以不同视图响应的内容?

感谢任何帮助!克里斯

4

1 回答 1

0

其中一个是用户列表,另一个是选项列表。
因此,即使目前,您的两个页面具有相同的功能,但它们彼此独立,并且您可能希望将来只为其中一个页面进行更改。

所以我会用两种不同的 javascript 动作来区分它们。这将使您更容易使他们在不同的道路上进化。

无论如何,正如你所看到的,它们已经完全不同了。你有两个不同的部分和两个不同的 html 标签 id。
在这里尝试为它们使用相同的代码似乎让我很困惑。

所以是的,我会创建两个操作,一个用于用户列表,一个用于他们的选项。

于 2009-10-05T14:06:30.077 回答