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) です。この問題を解決するにはどうすればよいですか?!