5

对不起,如果标题有点混乱。我有一个Item带有字段的表格name。有一个文本字段,用户可以在其中输入名称并提交。但是如果用户没有输入任何内容并点击提交,Rails 会给我一个param not found: item错误,我不知道该找谁来解决这个问题。

items_controller.rb

def new
  @item = Item.new()

  respond_to do |format|
    format.html
    format.json { render json: @item }
  end
end

def create
  @item = Item.new(item_params)

  respond_to do |format|
    if @item.save
      format.html { redirect_to items_path }
      format.json { render json: @item, status: :created, location: @item }
    else
      format.html { render action: 'new', :notice => "Input a name." }
      format.json { render json: @item.errors, status: :unprocessable_entity }
    end
  end
end

private

def item_params
  params.require(:item).permit(:name)
end

应用程序/视图/项目/new.html.haml

= form_for @item do |f|
  = f.label :name
  = f.text_field :name
  = f.submit "Submit"

params.require(:item) 部分是导致错误的原因。当 params[:item] 不存在时处理错误的约定是什么?

4

3 回答 3

8

答案已经晚了,但我仍然会为别人写。如rails指南中所述,您需要在强参数中使用 fetch 而不是 require ,如果没有任何输入作为输入,通过使用 fetch 您可以提供默认值。就像是:

params.fetch(:resource, {}) 
于 2013-11-07T11:05:51.883 回答
1

更新:

脚手架 rails4 应用程序: https ://github.com/szines/item_17751377

如果用户在创建新项目时将名称字段保持为空,则它可以工作......

看起来,它运行没有问题......

Development.log 显示,如果用户将字段保留为空,则参数将如下所示:

"item"=>{"name"=>""}

哈希中总有一些东西......

正如 Mike Li 在评论中已经提到的那样,出了点问题......因为这个参数不应该是空的 [:item]......

您可以检查是否有.nil?, 在这种情况下params[:item].nil?是否有,true如果它是nil. 或者您可以使用 .present?正如 sytycs 已经写的那样。

上一个答案:

如果你有 :item 为空的情况,你应该只使用 params[:item] 而不需要。

def item_params
  params[:item].permit(:name)
end

在 strong_parameters.rb 源代码中有关 require 的更多信息:

# Ensures that a parameter is present. If it's present, returns
# the parameter at the given +key+, otherwise raises an
# <tt>ActionController::ParameterMissing</tt> error.
#
#   ActionController::Parameters.new(person: { name: 'Francesco' }).require(:person)
#   # => {"name"=>"Francesco"}
#
#   ActionController::Parameters.new(person: nil).require(:person)
#   # => ActionController::ParameterMissing: param not found: person
#
#   ActionController::Parameters.new(person: {}).require(:person)
#   # => ActionController::ParameterMissing: param not found: person
def require(key)
  self[key].presence || raise(ParameterMissing.new(key))
end
于 2013-07-19T18:53:51.980 回答
0

我个人还没有切换到强参数,所以我不确定应该如何处理类似的事情:

 params.require(:item).permit(:name)

但您始终可以通过以下方式检查项目是否存在:

if params[:item].present?
   …
end
于 2013-07-19T21:29:28.793 回答