1

既知のデザインパターンが欠落しているかどうかはわかりませんが、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にとっては汚れているように感じます。呼び出し元のコントローラーに応じて異なるビューで応答する方法に何かが欠けていますか?

助けに感謝します!クリス

4

1 に答える 1

0

そのうちの 1 つはユーザーのリストで、もう 1 つはオプションのリストです。
したがって、現時点では 2 つのページに同じ機能がありますが、これらは互いに独立しているため、将来的には 1 つのみを変更する必要があるかもしれません。

したがって、2 つの異なる JavaScript アクションでそれらを区別します。これにより、より簡単に異なる経路で進化させることができます。

とにかく、ご覧のとおり、それらはすでにかなり異なっています。2 つの異なるパーシャルと 2 つの異なる html タグ ID があります。
ここで両方に同じコードを使用しようとすると、かなり混乱するようです。

はい、2 つのアクションを作成します。1 つはユーザー リスト用で、もう 1 つはユーザーのオプション用です。

于 2009-10-05T14:06:30.077 に答える