2009-10-05 36 views
0

我不確定我是否缺少已知的設計模式,但我一直使用RESTful路線Rails來解決以下問題。烘乾路線和javascript響應

在我的例子中,我有一個用戶控制器,可以以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方式來實現這一目標?我不認爲我需要創建一個新的控制器操作來對應不同的視圖,因爲這將涉及重複取景器代碼。我已經遇到到目前爲止,唯一的解決辦法是建立一些JavaScript條件到我RJS幫手:

# /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的。根據呼叫控制器的不同,我是否可以根據不同的視圖來回答問題?

感謝任何幫助! Chris

回答

0

在其中一個你有一個用戶列表和另一個選項列表。
因此,即使現在,您的兩個頁面具有相同的功能,它們彼此獨立,您可能需要在將來僅針對其中一個進行更改。

所以我會讓他們與兩個不同的JavaScript操作截然不同。它會讓你更容易讓他們在不同的道路上進化。

無論如何,正如你所看到的,它們已經完全不同了。你有兩個不同的部分和兩個不同的html標籤ID。
試圖讓他們在這裏有相同的代碼,這對我來說似乎很困惑。

所以是的,我會創建兩個動作,一個用於用戶列表,另一個用於他們的選項。

+0

感謝您的回答。我不確定這個例子是否清楚,但在這兩種情況下,我只是返回一個用戶名列表。在第一個例子中,這將填充分頁列表;在第二個,它將填充