1

すべてのユーザー モデル アカウントをテーブルに一覧表示する Rails 3 アプリのページの管理コントローラーがあり、各行の一部は、ユーザー モデルの is_admin 属性を切り替えるためのリンク (確認付き) である必要があります。これを行うには、管理者が現在の管理ステータスを一覧表示するテーブル セル内のテキストをクリックできるようにします (つまり、[いいえ] をクリックすると、is_admin が true に設定されます)。

今のところ、派手な AJAX アプローチには興味がありません。UI の観点からは、オブジェクトの状態を示すテキストをクリックしてその状態を切り替えることが必ずしも最良の選択ではないという事実は無視しておきましょう。

私が疑問に思っているのは、これを単一の link_to 呼び出し内で実行できるか、それともフォームを構築する必要があるかということです。私の管理コントローラーは、routes.rb で「resources :admin」として定義されrake routes、admin#update メソッドを呼び出す「admin」という名前のパスを持つ PUT アクションをリストします。

ここに私がこれまでに持っているものがあります:

<%= link_to (user.is_admin ?  "Yes" : "No"), 
             admin_path(:user => {:id => user.id, :is_admin => !user.is_admin}), 
             {:confirm => "Are you sure?", :method => :put} %>

私の考えでは、更新メソッドへの RESTful 呼び出しで十分なデータを渡して、その属性だけを変更できるようにしています。というメソッドを定義しtoggle_admin、ID だけを渡し、モデルのそのメンバーを操作するだけでよいことはわかっていますが、このアプローチは可能な限り RESTful であると考えていました。ここでlink_toを使用できます。

私が得ている私のエラーは次のとおりです。

No route matches {:action=>"destroy", :controller=>"admin", :user=>{:id=>1, :is_admin=>false}}

destroy メソッドを呼び出そうとしている理由がわかりません。管理者固有のルートのリストの最後にあるようです。

rake routes | grep admin
            site_admin        /admin(.:format)                {:controller=>"admin", :action=>"index"}
           admin_index GET    /admin(.:format)                {:action=>"index", :controller=>"admin"}
           admin_index POST   /admin(.:format)                {:action=>"create", :controller=>"admin"}
             new_admin GET    /admin/new(.:format)            {:action=>"new", :controller=>"admin"}
            edit_admin GET    /admin/:id/edit(.:format)       {:action=>"edit", :controller=>"admin"}
                 admin GET    /admin/:id(.:format)            {:action=>"show", :controller=>"admin"}
                 admin PUT    /admin/:id(.:format)            {:action=>"update", :controller=>"admin"}
                 admin DELETE /admin/:id(.:format)            {:action=>"destroy", :controller=>"admin"}

メソッドを間違って渡しているのではないかと思いましたが、デフォルトで最後のメソッドになっていますが、このページ:method =>では、:confirmeg を HTML オプションとして設定できることをお勧めします。

基本的に、私の質問は、このように link_to を介して RESTful な非 GET 呼び出しを行うことができるかどうかです。私は、Rails が舞台裏で小さなフォームを作成するだけだと思っていました。

この gistのその他のソース コード。

4

1 に答える 1

1

これを使って:

div_for @user do
  link_to (@user.is_admin? ? "Yes" : "No"), [@user, :toggle], :confirm => ...
end

そしてこのルート:

map.resources :users, :as => "admin", :member => { :toggle => :put }

そしてこのコントローラーメソッド:

class UsersController < ...
  def toggle
    @user = User.find params[:id], :lock => true
    @user.is_admin = !@user.is_admin?
    @user.save!
    if request.xhr?
      render :update {|page| page[@user].replace_html @user }
    else
      redirect_to @user
    end
  end
end

更新アクションへのリンクでこれを処理しようとすると、たった 1 つのケースでは複雑になりすぎます (いくつかの落とし穴があることはすでにわかっています)。link_to_remoteこの場合に使用するのがより良い候補です (あまりにも派手ではないことを示すために ajax 処理を既に追加した場合に備えて)。

于 2010-09-26T23:44:36.507 に答える