Rails - 更新未选中复选框时缺少参数(作为零值)

时间:2015-02-18 15:31:36

标签: ruby-on-rails forms checkbox parameter-passing form-for

我在表单中的某些复选框出现问题,因为当他们未经检查提交时,我收到错误param is missing or the value is empty: user

我不明白为什么要这样做;在大多数情况下,这个问题产生于我没有在隐藏字段中定义空白框。

值得注意的是,当检查某些内容时,复选框可以正常工作。

这里有复选框代码(@user是标准User.find(params[:id])):

       <%= form_for(@user) do |f| %>
          <h2>Add your dietary requirements:</h2>
          <div class="field">
                <% hidden_field_tag "user[dietary_requirement_ids][]", nil %> <!-- a lack of this field often seems to generate this problem -->
                <% DietaryRequirement.all.each do |dietary_requirement| %>
                  <%= check_box_tag "user[dietary_requirement_ids][]", dietary_requirement.id, @user.dietary_requirement_ids.include?(dietary_requirement.id), id: dom_id(dietary_requirement) %>
                  <%= label_tag dom_id(dietary_requirement), dietary_requirement.name %><br>
                <% end %>
              </div>
              <%= f.submit "Update your account", class: "btn btn-primary" %>
        <% end %>

当检查某些内容时,params正确地通过,如下所示:

Parameters: {"user"=>{"dietary_requirement_ids"=>["2"]}, "commit"=>"Update your account", "id"=>"2"}

虽然没有选择任何内容,但他们错误地提交如下:

Parameters: {"commit"=>"Update your account", "id"=>"2"}

令人沮丧的是,这些复选框对我来说至今都是完美的,今天开始抛出错误 - 没有明显的变化应该影响到这一点。

我有一点看,无法找到解决我特定问题的方法 - 任何人都可以提供帮助吗?

谢谢大家,史蒂夫。

修改

这是来自控制器的参数:

def user_params
  params.require(:user).permit(:first_name, :surname, :email, :password, :password_confirmation, :phone, :age, :address, :city, :postcode, :country, { :dietary_requirement_ids => [] })
end

编辑/更新操作,以防它们有用:

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

def update
    @user = User.find(params[:id])
    @fridge = @user.fridge
    if @user.update_attributes(user_params)
      flash[:success] = "Profile updated"
      redirect_to @user
    else
      redirect_to edit_user_path(@user)
    end
end

2 个答案:

答案 0 :(得分:2)

最后需要一个微小的编辑来解决这个问题。隐藏字段中缺少=,这意味着它没有加载到html中。这是修复后的代码,以防将来有人访问。

        form_for(@user) do |f| %>
          <h2>Add your dietary requirements:</h2>
          <div class="field">
                <%= hidden_field_tag "user[dietary_requirement_ids][]", nil %>
                <% DietaryRequirement.all.each do |dietary_requirement| %>
                  <%= check_box_tag "user[dietary_requirement_ids][]", dietary_requirement.id, @user.dietary_requirement_ids.include?(dietary_requirement.id), id: dom_id(dietary_requirement) %>
                  <%= label_tag dom_id(dietary_requirement), dietary_requirement.name %><br>
                <% end %>
              </div>
              <%= f.submit "Update your account", class: "btn btn-primary" %>
        <% end %>

您认为我已经从问题中的评论中找到了这一点。好吧 - 一切都很顺利!

答案 1 :(得分:1)

您告诉您的params哈希要求:user不存在,因此异常。

两个不是特别漂亮的解决方法:

1。在调用控制器中的:user之前,您可以在params散列前添加空require

class UserController < ApplicationController
  private

  def user_params
    params[:user] ||= {}
    params.require(:user).permit( .... )
  end
end

2。使用虚拟隐藏属性为您执行此操作。不要忘记将:dummy添加到允许的参数列表中。

class User < ActiveRecord::Base
  attr_accessor :dummy
end

<%= form_for(@user) do |f| %>
   <%= f.hidden_field :dummy, value: 'i am not empty!!!' %>
<% end %>

class UserController < ApplicationController
  private

  def user_params
    params.require(:user).permit(:dummy, ... )
  end
end