在块中使用form_for时,将错误的ID添加到link_to

时间:2015-06-02 05:59:54

标签: ruby-on-rails

当管理员登录我的应用程序时,他们会登陆显示所有具有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)。

1 个答案:

答案 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"

参考: form_for to_param