我希望该网站的管理员能够更新用户的权限。我的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
?或者可能是因为管理员正在尝试更新其他用户?
答案 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'
免责声明:未经测试。