1

User テーブルで一度に複数のユーザーを更新しようとしている Rails アプリケーションがあります。「、」で区切られた複数のIDを指定しようとしましたが、失敗し、「ルートが一致しません」などのエラーが発生しました。カスタムメソッド「割り当て」を作成し、ルートを として指定しました。

"assign/:id" => "users#assign" , :via => [:put] 

POSTMAN REST クライアントを介して更新しようとしています。

私のPUTリクエスト、

http://localhost:3000/assign/6,7,8    ---   PUT

データ:

{
   "users":[
    {
       "trainerid":4
    },
    {
       "trainerid":5
    },
    {
       "trainerid":6
    }
    ]
}

ミューコントローラー

def assign
    @ids = params[:id].split(",")
    @users = params[:users]
    @ids.each_with_index do |i|
      @user = User.find(i)
      @user.updateattributes(@users[index])
    end
    render :json => { :status => :ok, :message => "User Updated Successfully"}.to_json 
end

traineridここで、ユーザーテーブルを更新しようとしていますid: 4 ,5 ,6

別の方法で更新することは可能ですか。

どんな助けでも大歓迎です.....

4

4 に答える 4

2

なぜ ID を URL に入れるのですか? 文字列を分割するのは間違っているように感じます。ユーザー/割り当てだけの、より単純なルートを持たないのはなぜですか? 次に、JSON で次のことを行うことができます。

{ "users":[
  { "id":6, "trainer_id":4 },
  { "id":7, "trainer_id":5 },
  { "id":8, "trainer_id":6 }
]}

そして、次のように対処します。

def assign
  params[:users].each do |hash|
    User.find(hash['id']).update_attributes hash
  end
end

当然エラーハンドリングなどが必要ですが、それが基本的な方法です。update_attributes は、 attr_accessible としてフラグが立てられた属性のみを更新することに注意してください。そのため、ハッシュ内の ID の存在について心配する必要はありません。

于 2013-01-29T06:36:44.223 に答える
1

ルートをテストしましたが、ルーティング エラーは発生しません。ここに私が持っているものがあります:

match "assign/:id" => "users#assign" , :via => [:put] 

このルートでは、要求がコントローラーのアクションにassign/1,2,3正しくルーティングされます。assignその時点で、params[:id](既に行ったように) 分割する必要があります。

ただし、インスタンス変数を使用する必要はなく、必要ありませんeach_with_index

def assign
  ids = params[:id].split(",")
  users = params[:users]
  ids.each do |i|
    user = User.find(i)
    user.update_attributes(users[index])
  end
  render :json => { :status => :ok, :message => "User Updated Successfully"}.to_json
end

ただし、これが可能であると言うために、この回答を投稿しました。正直なところ、このように ID を分割する必要はないという @micapam の意見に同意します。

于 2013-01-29T06:38:59.107 に答える
0

edit_multipleおよびupdate_multipleアクションを使用するようにルートを更新します。

resources :users do
  get edit_multiple, :on => :collection
  post update_multiple, :on => :collection
end

次に、更新するユーザーデータを使用して@usersインスタンス変数を設定するedit_multipleアクションを作成します。

def edit_multiple
  @users = User.all #get the users with specified criteria.
end

edit_multiple.html.erb:

<%= form_tag :action => "update_multiple" do %>
  <% @users.each_with_index do |user, index| %>
    <%= fields_for "user[#{index}]", user do |f| %>
      <%= f.hidden_field :id, :value => user.id %>
      <div class="field">
        <%= f.label :name %><br />
        <%= f.text_field :name %>
      </div>
      <div class="field">
        <%= f.label :dob %><br />
        <%= f.date_select :dob %>
      </div>
    <% end %>
  <%end%> 
  <div class="actions">
    <%= submit_tag "submit" %>
  </div>
<% end %>

コントローラー内:

def update_multiple
  @users = {}
  error_count = 0

  params[:users].values.each do |user_params|
    user = User.find(user_params[:id])
    unless user.update_attributes(user_params)
      error_count += 1 #increment error count if fails to update
    end
    @users << user #add user to @users array to render the edit if fails
  end

  if error_count == 0
    redirect_to users_path, :notice => 'Users saved successfully'
  else
    render :edit_multiple #@users will play its role here
  end
end

それは最善のアプローチではないかもしれません。これがお役に立てば幸いです。JSON応答も使用できます。

于 2013-01-29T06:56:18.153 に答える
0

ルート

"assign/:id" => "users#assign" , :via => [:put] 

一度に 1 つの ID しか取得できません。このルートに複数の ID を渡すことはできません。

于 2013-01-29T06:24:50.963 に答える