1

Ruby on Rails と Web プログラミングは初めてです。私のアプリケーションには 2 つのモデルがあります。Directorate which has_many :users、および User which belongs_to :directorate。新しいユーザーを作成するとき<%= f.collection_select(:directorate_id,Directorate.all, :id, :name) %>は、new.html.erb フォームを使用して、新しいユーザーを特定の管理局に割り当てます。ただし、すべてのディレクタレートを一覧表示する dba 用の使いやすいインターフェイスを構築したいと考えています。各部門の横にすべてのユーザーをリストし、任意のユーザーを特定の部門に割り当てるためのリンクを示します。

私がしたことは次のとおりです。

Directorate モデルでは、次の関数を定義しました。

   def assign_user!(user)
      user.update_attributes(directorate_id: @directorate)
   end  

そして、directorates コントローラーで、次のアクションを定義しました。

 def assign_user
   @directorate = params[:directorate]
   assign_user! params[:user]
   redirect_to directorates_url
 end

現在、directories/index.html.erb には以下が含まれています。

    <h1>Listing directorates</h1>

<table>
  <tr>
    <th>Name</th>
    <th>Info</th>
  </tr>

<% @directorates.each do |directorate| %>
  <tr>
    <td><%= directorate.name %></td>
    <td><%= directorate.info %></td>

    <td><%= link_to 'Show', directorate %></td>
    <td><%= link_to 'Edit', edit_directorate_path(directorate) %></td>
    <td><%= link_to 'Destroy', directorate, confirm: 'Are you sure?', method: :delete %></td>
    <%= @directorate = directorate%>
<%= render 'users_form' %>
  </tr>
<% end %>
</table>

<br />

<%= link_to 'New Directorate', new_directorate_path %>

また、-users_form.html.erb には、次のフォームが含まれています (これは、各ディレクタレートの横にすべてのユーザーをリストし、任意のユーザーを特定のディレクタレートに割り当てるためのリンクを含む):

    <h1>Listing Users</h1>

    <table>
      <tr>
        <th>User Name</th>
      </tr>

      <% @users.each do |user| %>
      <tr>

        <td><%= user.username %></td>

        <td><%= link_to 'Assign to Current Directorate', {controller: 'directorates', action: 'assign_user', directorate: @directorate, user: user}, :method => :put %></td>
      </tr>
      <% end %>
    </table>

<br />

これが問題です。ディレクターをリストして「現在のディレクターに割り当て」をクリックすると、次のエラーが表示されます。

http://127.0.0.1:3000/directorates/assign_user?directorate=4&user=5

ActiveRecord::RecordNotFound in DirectoratesController#update

Couldn't find Directorate with id=assign_user
Rails.root: /home/ehab/sites/IAMS

Application Trace | Framework Trace | Full Trace
app/controllers/directorates_controller.rb:61:in `update'
Request

Parameters:

{"_method"=>"put",
 "authenticity_token"=>"L5tz3hv2IW0meE79qUq0/tjfGKwDlpC23hOeAWtmTvk=",
 "directorate"=>"4",
 "user"=>"5",
 "id"=>"assign_user"}

パラメータが「id」=>「assign_user」を送信していることは明らかですが、これは「id」=>「directorate.id」(上記の例では 4) です。この問題を解決するにはどうすればよいですか?!

4

1 に答える 1

2

まず第一に、ルートは assign_user がmember特定のオブジェクトのメソッドであることを示す必要がありdirectorateます:

resources :directorates do
  member do
    put :assign_user
  end
end

assign_user!次に、Directorateモデルとassign_userインで定義すると言いますDirectoratesControllerが、両方のメソッドは、インスタンス変数のように同じオブジェクト状態を共有することを意味しますが、@directorateこれは真実ではありません

コントローラーメソッドassign_userは漠然と次のように見えるはずです

def assign_user
  @directorate = Directorate.find params[:id]
  @user        = User.find params[:user_id]

  @directorate.assign_user! @user
end

モデルメソッドは次のようになります

def assign_user!(user)
  user.update_attributes(directorate_id: self.id)
end

Directorateさらに、ユーザーの属性を変更するように指示する代わりに、Userコントローラーが必要とするものに自分自身を割り当てるように指示します。

最後のビットは、ユーザーをディレクターに割り当てるリンクです。

link_to 'Assign to Current Directorate',
  assign_user_directorates_path(@directorate, :user_id => user)

上記のコードの 0 行は、構文の正確性についてもテストされています。コピーして貼り付けないでください。読んで理解してください。

于 2012-07-26T14:27:19.503 に答える