params [:input]的内容在嵌套循环中不进行任何修改而更改

时间:2014-08-14 08:49:24

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4 params

这是代码。我没有看到任何问题。对于第一个设备一切正常但是对于其他设备没有发生gsub,因为在我尝试将@data的内容更改回到发送推送之后params [:message],它们是一样的。

我不知道如何但是params [:message]就像数据一样从原始内容改变了。

你能指出我的错吗?

还有一个问题;是否还有其他方法可以进行此字符串替换,这是一种更有效的方法吗?

  def omg   # send all
    @devices= Device.all 

    @devices.each  do |device|  #one device

#"attribute"=>[".last_name", ".nickname"], 
#"message"=>"sadf.nickname.last_name", "commit"=>"checkbox test"}
#checkbox ticked[".last_name", ".nickname"]
#attributes icerigi bu [".last_name", ".nickname"]

    @attributeArray = params[:attribute] #checed values.


    @attributeArray.each do |attribute|
      #logger.info device.send(attribute) #device.first_name  

     logger.info "first params message"  + params[:message]

     @data= params[:message]


    @data.gsub!(attribute, device.send(attribute))



     end

    APNS.send_notification(device.token.to_s, @data )

      @data =params[:message]

        logger.info "params message"  + params[:message]
        logger.info  "data after push " + @data 
        logger.info "payload" + @data
    end

   redirect_to home_index_path

   end

编辑:

def omg   # send all
    @devices= Device.all 

    @devices.each  do |device|  #tek bir cihaz

#"attribute"=>[".last_name", ".nickname"], 
#"message"=>"sadf.nickname.last_name", "commit"=>"checkbox test"}
#checkbox ticked[".last_name", ".nickname"]
#attributes icerigi bu [".last_name", ".nickname"]

    @attributeArray = params[:attribute] #check edilmis valueler.


    @attributeArray.each do |attribute|
      #logger.info device.send(attribute) #device.first_name  

     logger.info "params messaji ilk bu  bu"  + params[:message]

     data= params[:message]

    #logger.info @data.gsub([nickname, attribute=> device.send(attribute) )  

    mahmut =data.gsub!(attribute, device.send(attribute))
    logger.info  "mahmut icerigi" + mahmut

    logger.info " baska data bu " + mahmut

    @payloadBoddy = mahmut

     end

    APNS.send_notification(device.token.to_s, @payloadBoddy )

        #@data =" "

        logger.info "params messaji bu"  + params[:message]
        logger.info  "push sonrasi data " + @payloadBoddy 
        logger.info "data bu " + @payloadBoddy
    end

   redirect_to home_index_path

   end

我改变了一下代码。

现在它适用于几个设备,但只适用于一个属性。

哇,我错过了什么

3 个答案:

答案 0 :(得分:1)

而不是

@attributeArray.each do |attribute|
  logger.info "first params message"  + params[:message]
  @data= params[:message]
  @data.gsub!(attribute, device.send(attribute))
end

执行:

@data = params[:message].dup

@attributeArray.each do |attribute|
  logger.info "first params message"  + params[:message]
  @data.gsub!(attribute, device.send(attribute))
end

答案 1 :(得分:1)

当你这样做时

@data = params[:message]

然后@data只是对params[:message]的同一个ruby对象的引用,所以当你使用gsub!时,你正在改变params[:message]。我并不完全清楚你在做什么,但看起来你正在使用params[:message]作为某种模板,你正在使用各种属性值。

您实际上依赖于此行为,因为您通过属性循环每次迭代设置@data。最简单的解决方案是在循环之前复制消息,即

@payloadBody = params[:message].dup
@attributeArray.each do |attribute|
  @data.gsub!(attribute, device.send(attribute))
end    
APNS.send_notification(device.token.to_s, @payloadBody )

最后要小心在调用send时使用用户提供的参数(params [:attribute])的值。例如,如果他们已通过destroy该怎么办?如果您将代码简化为显示问题的最小示例,那么您也可以更轻松地回答问题 - 数十条注释掉的行或记录调用只是杂乱无章

答案 2 :(得分:0)

当你这样做时:

data = params[:message]

您不是在创建新对象 - 只是为同一个对象指定一个新名称。如果您不想修改它,可以先要求提供副本:

data = params[:message].dup

然后你可以在不影响原始参数的情况下使用gsub。