既知のデザインパターンが欠落しているかどうかはわかりませんが、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方法は何でしょうか?ファインダーコードを繰り返す必要があるため、別のビューに対応する新しいコントローラーアクションを作成する必要はないと思います。私がこれまでに遭遇した唯一の解決策は、いくつかの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にとっては汚れているように感じます。呼び出し元のコントローラーに応じて異なるビューで応答する方法に何かが欠けていますか?
助けに感謝します!クリス