### Ruby的25个编程细节(技巧、实用代码段) #### 1. 使用 `try` 方法处理潜在的异常 在Ruby中,`try` 方法是一个非常有用的功能,它允许我们安全地访问对象的方法或属性,即使该对象为 `nil` 也不会抛出异常。相反,如果没有找到对象或者对象为 `nil`,`try` 会返回 `nil`。 **示例代码:** ```ruby province_id = Province.find_by_name(prov).try(:id) ``` **解析:**这段代码尝试通过名称查找一个省份,并获取它的 ID。如果 `Province.find_by_name(prov)` 返回 `nil`,那么 `.try(:id)` 也不会抛出异常,而是返回 `nil`。 #### 2. 使用 `find(:first, :conditions)` 查询单条记录 在Rails中,`find` 方法有许多变体,其中之一就是 `find(:first)`,用于查询符合条件的第一条记录。结合 `:conditions` 参数,我们可以指定查询条件。 **示例代码:** ```ruby mobile_info = MobileInfo.find(:first, :conditions => ["mobile_num=?", mobile_num.to_i]) ``` **解析:**这段代码查询了 `MobileInfo` 表中第一条与 `mobile_num` 相匹配的记录。 #### 3. 使用 `find(:all, :select, :conditions)` 多条件查询 当需要查询多个特定字段并附加复杂条件时,可以使用 `find(:all)` 并结合 `:select` 和 `:conditions` 参数。 **示例代码:** ```ruby support_amount_a = ProvinceMerchantChangeValue.find(:all, :select=>"DISTINCT change_value_id", :conditions=>["status=1 and merchant_id=? and province_id=? and channel_id in (select id from channels where status=1)", merchant_id, province_id]).map{|cv| cv.change_value_id}.compact support_amount_s = ChangeValue.find(:all, :select=>"price", :conditions=>["id in (?)", support_amount_a]) \ .map{|cv| cv.try(:price).to_i}.compact ``` **解析:** 1. 第一段代码查询了 `ProvinceMerchantChangeValue` 表中的所有记录,并选择了唯一不重复的 `change_value_id`。 2. 第二段代码基于上一步查询的结果 `support_amount_a` 进行二次查询,获取 `ChangeValue` 表中对应的价格。 #### 4. 发送POST请求 在开发过程中,经常需要通过命令行发送HTTP请求,Ruby提供了多种方式来实现这一需求,其中 `curl` 是一种常见的工具。 **示例代码:** ```bash curl -d "channel=中信异度支付&action_type=娱人节-手机充值&user_indicate=13911731997&original_amount=10000" http://xx.xxx.xxx:3000/search.json ``` **解析:**此命令使用 `curl` 向指定URL发送了一个包含多个参数的POST请求。 #### 5. Ruby中的纯数据结构: Struct与OpenStruct **Struct** 和 **OpenStruct** 都是用来创建简单的数据容器的类,但它们之间存在一些显著的区别: - **Struct** 在定义时需要明确声明所有字段,而 **OpenStruct** 可以动态添加属性。 - 性能方面,**Struct** 优于 **OpenStruct**。 - **Struct** 是Ruby解释器内置的,使用C语言实现;而 **OpenStruct** 是Ruby标准库的一部分,使用Ruby语言实现。 - 它们的API也有所不同,**Struct** 提供了更多类似于类的方式,而 **OpenStruct** 更加灵活。 **示例代码:** ```ruby require 'ostruct' # 使用Struct Person = Struct.new(:name, :age) # 使用OpenStruct person = OpenStruct.new person.name = "张三" person.age = 25 ``` #### 6. 注册自定义MIME类型 为了支持更多的文件格式,在Rails应用中可以注册自定义的MIME类型。 **示例代码:** ```ruby Mime::Type.register "application/json", :ejson ``` **解析:**这段代码注册了一个新的MIME类型 `application/json`,并将它映射到 `:ejson` 符号。 #### 7. 解决安全问题 在Rails应用中,有时候需要修改默认的安全设置来避免潜在的风险。 **示例代码:** ```ruby ActiveSupport::CoreExtensions::Hash::Conversions::XML_PARSING.delete('symbol') ActiveSupport::CoreExtensions::Hash::Conversions::XML_PARSING.delete('yaml') ``` **解析:**这段代码移除了XML和YAML解析中的两个选项,提高了安全性。 #### 8. 自定义Rails默认配置 在Rails应用中,可以通过初始化文件来自定义框架的行为。 **示例代码:** ```ruby if defined?(ActiveRecord) # Include ActiveRecord classname as root for JSON serialized output. ActiveRecord::Base.include_root_in_json = true # Store the full classname (including module namespace) in STI type column. ActiveRecord::Base.store_full_sti_class = true end ActionController::Routing.generate_best_match = false # Use ISO8601 format for JSON serialized times and dates. ActiveSupport.use_standard_json_time_format = true # Don't escape HTML entities in JSON, leave that for the #json_escape helper. # if you're ``` **解析:** 1. 如果定义了 `ActiveRecord`,则设置了两项配置: - `include_root_in_json` 为 `true`,表示在序列化JSON输出时包括模型类名。 - `store_full_sti_class` 为 `true`,表示在单表继承(Single Table Inheritance, STI)模式下存储完整的类名(包括模块命名空间)。 2. `generate_best_match` 被设置为 `false`,这改变了路由生成的最佳匹配算法。 3. `use_standard_json_time_format` 设置为 `true`,使JSON序列化的时间和日期使用ISO8601格式。 4. 不对JSON中的HTML实体进行转义,保留原始格式。 以上内容涵盖了给定文件中的25个编程细节中的部分细节,这些技巧和代码段对于Ruby开发者来说是非常有价值的资源,能够帮助他们在实际开发过程中更加高效地解决问题。
- 粉丝: 5
- 资源: 872
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 带载流子密度的双温模型matlab,电子晶格温度,电子密度,飞秒激光源模拟,有限元法解偏微分方程 德鲁德模型,带载流子密度变化
- GP026-仓库系统.zip
- HttpCanary_3.3.6.apk
- 线控制动系统仿真 Carsim和Simulink联合仿真线控制动系统BBW-EMB系统 包含简单的制动力分配和四个车轮的线控制动机构 四个车轮独立BLDCM三环PID闭环制动控制,最大真实还原线
- Comsol脉冲涡流无损检测仿真 图一:脉冲涡流仿真,检出电压信号 图二:脉冲涡流模型 图三:磁通密度模 图四:磁通密度模
- CC2530无线zigbee裸机代码实现光敏和热敏传感器数值读取.zip
- CC2530无线zigbee裸机代码实现继电器的控制.zip
- CC2530无线zigbee裸机代码实现看门口狗Watch Dog使用.zip
- CC2530无线zigbee裸机代码实现控制步进电机正反转.zip
- CC2530无线zigbee裸机代码实现人体红外传感器数值读取.zip
- CC2530无线zigbee裸机代码实现睡眠定时器唤醒系统.zip
- CC2530无线zigbee裸机代码实现外部中断控制LED开关.zip
- CC2530无线zigbee裸机代码实现外部中断控制流水灯.zip
- 基于51单片机的污水处理厂气体检测报警系统(protues仿真)-毕业设计
- CC2530无线zigbee裸机代码实现温度传感器DS18B20数值读取.zip
- CC2530无线zigbee裸机代码实现温湿度传感器DHT11数值读取.zip