当管理员登录我的应用程序时,他们会登陆显示所有具有ID,电子邮件等用户的页面,但也可以更改用户的角色。
当我尝试通过在下拉列表中选择新角色并点击提交来更改角色时,会遵循正确的users_path
,但不会将id
传递给params,而是推送另一个属性,来自用户模型的api_key
。
我知道我可以更改此代码以推送(id: user.id)
,因为我已经完成了以下几个实例,但我真的很想了解这是怎么回事,因为这不是&#39 ;之前的问题,我真的无法理解它如何/为什么抓住api_key
。
users_controller
def index
unless current_user.application_admin?
redirect_to :back, :alert => "You do not have permission to access this page."
end
@users = User.all
end
相关视图/表单index.html.erb
<table class="table">
<tbody>
<% @users.map do |user| %>
<tr>
<td><%= user.id %></td>
<td><%= link_to user.name, user_path(id: user.id) %></td>
<td><%= user.email %></td>
<td><%= user.created_at %></td>
<td><%= link_to user.email, user_path(id: user.id) %></td>
<td>
<%= form_for user do |f| %>
<%= f.select(:role, User.roles.keys.map {|role| [role.titleize,role]}) %>
<%= f.submit 'Change Role', :class => 'button-xs' %>
<% end %>
</td>
<td>
<%= link_to("Delete user", user_path(id: user.id), :data => { :confirm => "Are you sure?" }, :method => :delete, :class => 'button-xs') unless user == current_user %>
</td>
</tr>
<% end %>
</tbody>
</table>
编辑以指定:
我已经添加user_path(id: user.id)
正常工作。我最感兴趣的是,在表格中的嵌入式form_for
中,提交按钮如何插入除api_key
以外的模型属性(id
)。
答案 0 :(得分:0)
您的form_for user do |f|
应评估为:
form_for user, as: :user, url: user_path(user), method: :patch, html: { class: "edit_user", id: "edit_user_45" } do |f|
user_path(user)
将运行User#to_param
来检索标识符。默认情况下,它会返回id
,因此您或您的某个宝石会覆盖它以返回api_key
。
您可以在rails控制台中运行快速测试:
> user = User.last
> app.user_path(user)
=> "/users/45"
> def user.to_param
* "a"
* end
=> :to_param
> app.user_path(user)
=> "/users/a"