【问题标题】:link to update model parameter yields missing or empty value error更新模型参数的链接产生缺失或空值错误
【发布时间】:2015-06-30 14:48:00
【问题描述】:

I'm trying to give provide a series of links that when selected will update a corresponding user's parameter to that which is supplied by the link without rendering a form.我遇到的唯一问题是,当它调用我得到的更新方法时:参数丢失或值为空:用户

更新方法

 def update
@user = User.find(params[:id])
if @user.update(user_params)
  redirect_to list_path
  flash[:success] = "User updated"
else
  redirect_to list_path
  flash[:alert] = "User not updated"
end
end

private

def user_params
  params.require(:user).permit(:name, :email, :password,
                               :password_confirmation, :title, :role, :address, :phone)
end

link_to

<% User.all.each do |user| %>
        <% if user.role == "new" %>
      <tr>
        <td><%= user.name %></td>
        <td><%= user.title %></td>
        <td><%= user.role %></td>
        <td><%= link_to "Admin", update_user_path(id: user.id, :role => "admin"), :method => :put %> / <%= link_to "Moderator", '#' %> / <%= link_to "Member", '#' %> / <%= link_to "Other", '#' %></td>
      </tr>
        <% end %>
      <% end %>

param.inspect

{"_method"=>"put",
"authenticity_token"=>"AUcV1swtGmRuDelTzLkbLd9Gmj6+phnHaSFRqrvDyETLoxNUQSaAgkes4ViWXoAZ33K5NZojVz9XdgIIsqJblA==",
"id"=>"2",
"role"=>"admin"}

根据我的发现,params.inspect 在列出的所有参数之前应该有类似[:user] =&gt; 的内容,但我无法弄清楚为什么不是,也无法成功找到澄清的方法。

错误:
参数丢失或值为空:用户

def user_params     
  **params.require(:user).permit(:name, :email, :password,**
                               :password_confirmation, :title, :role, :address, :phone)
end
end

选择链接后记录

Started PUT "/update_user?id=4&role=admin" for 97.78.175.155 at 2015-06-30   15:51:47 +0000
Cannot render console from 97.78.175.155! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255
Processing by UsersController#update as HTML
  Parameters: {"authenticity_token"=>"m+LcLOBL5NBXHQXD19o45/iV07/V1HiAXpykV+NiXIpRBtqubUB+Nn68DciNPaPT+KHwtPFRNnhgy/f16gPPWg==", "id"=>"4", "role"=>"admin"}
  User Load (0.2ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1  [["id", 1]]
  User Load (0.1ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1  [["id", 4]]
Unpermitted parameters: _method, authenticity_token, id
       (0.2ms)  begin transaction
          User Exists (0.2ms)  SELECT  1 AS one FROM "users" WHERE (LOWER("users"."email") = LOWER('qwerty@poster.com') AND "users"."id" != 4) LIMIT 1
       (0.1ms)  rollback transaction
Redirected to https://rails-tutorial-hougthonbrad.c9.io/list
Completed 302 Found in 11ms (ActiveRecord: 0.7ms)


Started GET "/list" for 97.78.175.155 at 2015-06-30 15:51:47 +0000
Cannot render console from 97.78.175.155! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255
Processing by UsersController#list as HTML
  User Load (0.2ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1  [["id", 1]]
  User Load (0.5ms)  SELECT "users".* FROM "users"
  Rendered users/list.html.erb within layouts/application (3.4ms)
Completed 200 OK in 172ms (Views: 165.1ms | ActiveRecord: 0.7ms)

【问题讨论】:

    标签: ruby-on-rails-4 link-to update-attributes


    【解决方案1】:

    将您的更新操作更改为以下内容。

    def update
    @user = User.find(params[:id])
    if @user.update(user_params)
      redirect_to list_path
      flash[:success] = "User updated"
    else
      redirect_to list_path
      flash[:alert] = "User not updated"
    end
    end
    

    更新 #1:

    查看您的参数,您需要更改您的user_params,如下所示。

    def user_params
      params.require(:user).permit(:id, :name, :email, :password, :password_confirmation, :title, :role, :address, :phone)
    end
    

    更新 #2:

    尝试将您的link_to 更改为以下内容

    <%= link_to "Admin", update_user_path(user, user: {:id => user.id, :role => "admin"}), :method => :put %>
    

    【讨论】:

    • 它仍然突出显示 user_params 并显示相同的错误。
    • @Houghtonbrad 请使用完整的错误日志更新您的帖子。
    • 我在帖子中添加了更多细节
    • @Houghtonbrad 好的。你也可以发布用于更新的表格吗?
    • 如果您指的是form_for,我正在尝试在不使用表单的情况下更新此单个参数,并根据所选链接(即管理员/版主/成员)指示分配给它的内容/列入黑名单)
    【解决方案2】:

    您的 user_params 中有 params.require(:user)user 哈希通常由 form_for 生成。

    我建议为您的用例呈现一个隐藏所有字段的表单,除了提交按钮。

    【讨论】:

    • 我试了一下,我又回到了原点。我开始认为这是我的更新方法本身。
    • 我不确定您的问题和错误是否最新。建议您编写一个单独的方法来更新用户角色,而不是依赖通用的 update 方法。这将允许您 permit 您需要的特定属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多