【问题标题】:How do I iterate through a hash in an objects param hash?如何遍历对象参数哈希中的哈希?
【发布时间】:2015-06-16 19:35:32
【问题描述】:

Rails(和编码)新手(我确信我只是缺少基本的语法结构),我创建了一个表单,用户可以通过 AJAX(几乎没有)添加任意数量的字段对。此表单将收集“工作表”和相关数据类型(int、str...等)的列标题。该工作表将包含用户稍后添加的项目条目。我正在尝试制作一个表格控制器创建方法,该方法不仅可以保存表格的标题和描述,还可以在“列”表中添加一条记录,其中包含列标题、数据类型和关联的表格 ID。当我提交表单时,我在服务器终端中获得以下参数: (对不起,我不确定如何包装代码 sn-p)

{"utf8"=>"✓", "authenticity_token"=>"yMlnfO1EWptkEXp5+9AGCO5C3vHt62EUHoKjdWoUB8I=", "sheet"=>{"title"=>"test 33", "description"=>"Descriptions"}, "column"=>[{"title"=>"1", "type"=>"num"}, {"title"=>"2", "type"=>"int"}, {"title"=>"3", "type"=>"real"}, {"title"=>"fo", "type"=>"no"}], "commit"=>"Save Specsheet!"}

我正在尝试遍历列哈希以在列表上创建记录。每个散列都会使用标题和类型值作为表中的条目。

我的创建方法:

   def create
@sheet = Sheet.new(sheet_params)
@sheet[:column].each do |key, value|
  @column = Column.new
  @column[:column_title] = key
  @column[:column_data_type] = value
  @column.save
end

if @sheet.save
  redirect_to @sheet
else
  flash[:error] = "Error saving sheet."
  render :new
end

结束

我的错误通常是这样的: nil:NilClass 的未定义方法“each”

**@sheet[:column].each do |key, value|**
  @column = Column.new
  @column[:column_title] = key
  @column[:column_data_type] = value

所以我知道我在引用列哈希及其键和值时搞砸了。我想我可以在这里减少一些东西?我不知道。这些基本的结构问题并没有真正出现在谷歌搜索中,所以请让我知道我做错了什么,感谢您阅读所有这些!干杯!

工作代码(抱歉格式奇怪)

  def create
@sheet = Sheet.new(sheet_params)

column_params.each do |value|
  @sheet.columns.build(value.permit(:title, :data_type))
end

if @sheet.save
  redirect_to @sheet
else
  flash[:error] = "Error saving sheet."
  render :new
end

结束

      private
  def sheet_params
    params.require(:sheet).permit(:title, :description, :created_at, :updated_at, :column)
  end

  def column_params
    params.require(:column)
  end

【问题讨论】:

  • sheet_params[:column].each do |key, value| 可能会更好。发布sheet_params 方法。
  • 谢谢萨蒂亚!我已经使用您的评论和下面的答案来找出解决方案。

标签: ruby-on-rails ruby loops hash syntax


【解决方案1】:

当您调用 @sheet[:column] 时,您引用的是 Sheet 的一个实例,而不是您尝试循环访问的参数。

如果您尝试在 has_many 关系中将列与表格相关联,您可以创建如下所示的列:

column.each do |key, value| 
  @sheet.columns.new( 
    column_title: key
   column_data_type: value
  end
end  

(然后保存块) 在您的控制器中。其中column 是参数。这将表明该列属于工作表实例。

如果你想在没有关联的情况下创建 Column 记录,你可以这样做

column.each do |key, value|
  Column.new( 
    column_title: key
    column_data_type: value
  end 
end

(然后保存块)

(都假设您的字段名为column_title 而不仅仅是title。)

【讨论】:

  • 是的。谢谢!我在引用工作表的实例时是错误的。我现在已经引用了 column_params 方法,它可以工作。我还更改了 |key, value|只是|价值|因为我已经意识到 :column 是一个哈希数组,而不是一个哈希。我会将我的工作代码添加到我的帖子中。
猜你喜欢
  • 2012-04-21
  • 1970-01-01
  • 2012-08-22
  • 2014-06-01
  • 2021-01-28
  • 1970-01-01
  • 2016-09-03
  • 2013-11-25
相关资源
最近更新 更多