干掉路线和javascript响应

时间:2009-10-05 13:47:47

标签: ruby-on-rails ajax rjs

我不确定我是否错过了一个已知的设计模式,但我不断遇到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', ...})

我的问题是实现这一目标的最佳方式是什么?我认为我不需要创建一个新的控制器动作来对应不同的视图,因为这将涉及重复查找器代码。到目前为止,我遇到的唯一解决方案是在我的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来说非常脆弱,不洁净。我是否遗漏了一些关于如何根据呼叫控制器响应不同视图的内容?

感谢任何帮助! 克里斯

1 个答案:

答案 0 :(得分:0)

在其中一个中,您有一个用户列表,另一个有一个选项列表 因此,即使现在,您的两个页面具有相同的功能,它们彼此独立,您可能希望将来只为其中一个更改内容。

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

无论如何,你可以看到,他们已经完全不同了。你有两个不同的部分和两个不同的html标签id 试图为他们提供相同的代码对我来说似乎很困惑。

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