【问题标题】:How to pass nested key to the object of rails params如何将嵌套键传递给rails params的对象
【发布时间】:2013-10-19 11:59:29
【问题描述】:

我正在我的项目管理工具中生成 RFP 插件。在那个插件中,我基本上填写了一个表单,几乎没有 usr 要求,例如哪种技术、多少资源、小时数等......

现在在填写后提交表单时,假设我在表单中填写了 5 个字段(可能是文本字段、文本区域、布尔值等...)然后提交它会创建 5 个问题

即表单的第一个字段应该创建第一个问题

表单的第二个字段应该创建第二个问题

第三个字段如果我在表单中保持空白,则不会创建该问题

等等

如果特定键存在值,我想为每个散列键创建新问题

一种解决方案是,在用户哈希中,填写表单后会出现许多键值和值,但是如何将每个键值分开并在此基础上应用一些循环并创建新问题

我的参数[:user1] 是

    {"project_id"=>"first1",
    "user1"=>
     {"ffval_attributes"=>{"ckval"=>"0"},
     "opval_attributes"=>{"ckval"=>"0"},
     "jvusedfor"=>"menu sidebar",
     "user3_attributes"=>
     {"drupal"=>"0",
     "wordpress"=>"0",
     "joomla"=>"0",
     "other2"=>"0",
     "Typo3"=>"0"},
     "user2"=>
       {"cms_ex"=>"ruby", "java"=>"0", "dotnet"=>"0", "other1"=>"1", "php"=>"0"},
       "pagenumber_attributes"=>{"uniquepages"=>"3", "subsequentpages"=>"4"},
       "gcvals_attributes"=>{"ckval"=>"0"},
       "pagetype"=>"false",
       "nojavascript"=>"7",
       "src_id"=>"",
       "numberofmenu"=>"5",
       "ss1"=>"0",
       "type1"=>"false",
       "sfval_attributes"=>{"ckval"=>"0"},
       "design_pattern"=>"5",
       "dcomplex"=>"no",
       "ieval_attributes"=>{"ckval"=>"0"},
       "checkpixel"=>"true",
       "base"=>"true",
       "nohacks"=>"5",
       "fuvalue"=>"true",
       "mobile"=>"true"},
       "utf8"=>"",
       "commit"=>"Create User1",
       "authenticity_token"=>"UlrGhESPKK6zSr6aL2iIpGt9mR2K5tgBA3NnZP44+XE="}

我在控制器中尝试过

          u = params[:user1]
      a = Issue.last
      a = a.id

      u.each do |key, value|

     if   value.present?

    issue = Issue.new
    issue.id = a + 1 
    **issue.subject = key**
    ssue.tracker_id = 1
    issue.project_id = 1
    issue.priority_id = 2
    issue.status_id = 1
    issue.author_id = 1
    issue.save
    a = a + 1
    end 

我的问题是

如果存在值,如何在 issue.subject 上传递嵌套哈希键 提前致谢

【问题讨论】:

标签: ruby-on-rails ruby ruby-on-rails-3 forms hash


【解决方案1】:

如果您想根据来自 params 的用户参数创建 Issue 对象,那么,

首先只选择用户参数

user_params = params.select{|k,v| k.include?('user')}

将选定的user_params 传递给方法,

def get_issue_attribute(user_params)
  user_params.each do |key, value|
    value.is_a?(Hash) ? get_issue_attribute(value) : create_issue({key => value})
  end
end

上述方法中使用递归调用来获取user_params的最内层参数

def create_issue(attr) 
  # Code for issue creation
end

【讨论】:

    【解决方案2】:

    您可以使用has_key? 函数来确认一个值是否存在于哈希中,如果存在则处理数据。

    或者,您可以执行以下操作来检查嵌套哈希中是否存在值:

    if params[:issue]
       if params[:issue][:subject]
            # whatever code you want to do
       end
    end
    

    【讨论】:

    • 我尝试了同样的方法,但是嵌套键值存在呢,我如何检查我可以检查?如果你有,请给我看例子
    • 谢谢 但它应该类似于 if params[:user1] if params[:user1][:first hashkey ] 但如何知道 :first hashkey 值存在,所以我可以将其分配给问题。主题
    • 你想为每个用户哈希的每个最内层哈希创建一个问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-15
    • 2014-05-07
    • 2017-01-15
    • 1970-01-01
    相关资源
    最近更新 更多