我不確定我是否缺少已知的設計模式,但我一直使用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
感謝您的回答。我不確定這個例子是否清楚,但在這兩種情況下,我只是返回一個用戶名列表。在第一個例子中,這將填充分頁列表;在第二個,它將填充
視圖意味着以不同的方式顯示事物。如果你有兩次相同的數據,但想要以不同的方式顯示兩次,那麼做事的好方法就是不做條件。但要做兩個意見。 – 2009-10-05 14:38:43
如何將條件轉化爲視圖?這是不是一個好習慣?我正在考慮一些根據條件在同一動作中渲染不同視圖的方法,例如: render(condition?view_one:view_two) – 2009-10-06 07:26:10