我不确定我是否错过了一个已知的设计模式,但我不断遇到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来说非常脆弱,不洁净。我是否遗漏了一些关于如何根据呼叫控制器响应不同视图的内容?
感谢任何帮助! 克里斯
答案 0 :(得分:0)
在其中一个中,您有一个用户列表,另一个有一个选项列表 因此,即使现在,您的两个页面具有相同的功能,它们彼此独立,您可能希望将来只为其中一个更改内容。
所以我会用两种不同的javascript动作来区分它们。这将使你更容易让他们在不同的道路上进行演变。
无论如何,你可以看到,他们已经完全不同了。你有两个不同的部分和两个不同的html标签id 试图为他们提供相同的代码对我来说似乎很困惑。
所以是的,我会创建两个动作,一个用于用户列表,另一个用于他们的选项。