这是代码。我没有看到任何问题。对于第一个设备一切正常但是对于其他设备没有发生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
我改变了一下代码。
现在它适用于几个设备,但只适用于一个属性。
哇,我错过了什么答案 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。