在Rails中仅更新单个属性时缺少参数

时间:2015-06-19 16:35:45

标签: ruby-on-rails

我希望该网站的管理员能够更新用户的权限。我的user模型有一个属性permissions_id,它只是一个甚至与另一个表无关的整数,只是我稍后会引用的数字。

转到param is missing or the value is empty: user网址时,我得到的错误为users/:id/choose_permissions。我认为用户的其他信息在尝试更新用户时会传递给控制器​​,但它没有看到用户通过它。

我已尝试将参数转换为params.fetch(:user, {}).permit(...) as suggested here,但只要我转到users/:id/choose_permissions,它就会跳过表格。

应用/控制器/ users_controller.rb

def choose_permissions
  @user = User.find(params[:id])
  if @user.update_attributes(user_params)
    flash[:success] = "User updated"
    redirect_to @user 
  else
    render 'update_permissions'
  end
end

private

  def user_params
    params.require(:user).permit(:name, :email, :password, 
                                 :password_confirmation, :permissions_id)
  end

应用/视图/用户/ choose_permissions.html.erb

<%= form_for(@user) do |f| %>

  <%= f.label "Choose permissions" %>
  <%= f.password_field :permissions_id, class: 'form-control' %>

  <%= f.submit "Save changes", class: "btn btn-primary" %>
<% end %> 

配置/ routes.rb中

resources :users do
  member do
    get :choose_permissions
  end
end

是否因为此页面是GET请求而不是PATCH?或者可能是因为管理员正在尝试更新其他用户?

1 个答案:

答案 0 :(得分:1)

您的控制器出现问题,您应该以这种方式拆分编辑和更新操作:

def edit_choose_permissions
  @user = User.find(params[:id])
end

def update_choose_permissions
  @user = User.find(params[:id])
  if @user.update_attributes(user_params)
    flash[:success] = "User updated"
    redirect_to @user 
  else
    render 'edit_update_permissions'
  end
end

由于您没有关注REST,因此您应该在表单中指定网址:

<%= form_for(@user, url: update_choose_permissions_path(@user)) do |f| %>

同样对于您的路线,您必须以这种方式重写它们:

get 'users/:id/choose_permissions, to: 'users#edit_choose_permissions', as: 'edit_choose_permissions'
patch 'users/:id/choose_permissions, to: 'users#update_choose_permissions', as: 'update_choose_permissions'

免责声明:未经测试。