如何在对象参数哈希中迭代哈希?

时间:2015-04-10 23:47:20

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

Rails(和编码)新手在这里(我确定我只是缺少基本的语法结构),我创建了一个表单,用户可以添加尽可能多的字段对通过AJAX(勉强)。此表单将收集“表格”的列标题。和相关的数据类型(int,str ......等)。工作表将在以后由用户添加项目条目。我试图创建一个Sheets控制器创建方法,不仅可以保存工作表的标题和描述,还可以在“'”列中添加记录。包含列标题,数据类型和关联的工作表ID的表。当我提交表单时,我在服务器终端中获得以下参数: (对不起,我不确定如何打包代码片段)

{"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

我的错误通常是这样的: 未定义的方法`每个'为零:NilClass

**@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

1 个答案:

答案 0 :(得分:0)

当您呼叫@sheet[:column]时,您正在引用Sheet的实例而不是您尝试循环的参数。

如果您尝试将列与has_many关系中的表关联,则可以创建如下列:

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

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

如果您尝试在没有关联的情况下创建列记录,则可以执行

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

(然后保存块)

(两者都假设您的字段名为column_title,而不只是title。)