特点:类似静态路由,简单易用,手动建立lsp,定制转发路径,无需控制报文,资源消耗少。
缺点:不适合大型复杂拓扑,不能根据网络变化而动态调整,需要管理员手动调整。(结合BFD可以自动切换)
LSR_1、LSR_2、LSR_3为MPLS骨干网设备。要求通过配置静态LSP隧道,使这分支和总部互访的报文能够通过LSP在MPLS网络中进行传输。如下图所示。

具体配置及解析如下
LSR_1:
#
sysname LSR_1
#
mpls lsr-id 10.10.1.1 //配置MPLS LSR ID
mpls //使能全局MPLS功能
#
interface GigabitEthernet1/0/0
ip address 10.1.1.1 255.255.255.0
mpls //使能接口MPLS功能
#
interface GigabitEthernet2/0/0
ip address 10.3.1.1 255.255.255.0
#
interface LoopBack1
ip address 10.10.1.1 255.255.255.255
#
ospf 1 //配置路由
area 0.0.0.0
network 10.1.1.0 0.0.0.255
network 10.3.1.0 0.0.0.255
network 10.10.1.1 0.0.0.0
#
static-lsp ingress LSP1 destination 10.4.1.0 24 nexthop 10.1.1.2 out-label 20 //配置本节点为指定LSP1的Ingress
static-lsp egress LSP2 incoming-interface GigabitEthernet1/0/0 in-label 60 //配置本节点为指定LSP2的Egress
#
return
LSR_2:
#
sysname LSR_2
#
mpls lsr-id 10.10.1.2
mpls
#
interface GigabitEthernet1/0/0
ip address 10.1.1.2 255.255.255.0
mpls
#
interface GigabitEthernet2/0/0
ip address 10.2.1.1 255.255.255.0
mpls
#
interface LoopBack1
ip address 10.10.1.2 255.255.255.255
#
ospf 1
area 0.0.0.0
network 10.1.1.0 0.0.0.255
network 10.2.1.0 0.0.0.255
network 10.10.1.2 0.0.0.0
#
static-lsp transit LSP1 incoming-interface GigabitEthernet1/0/0 in-label 20 nexthop 10.2.1.2 out-label 40 //配置本节点为指定LSP1的Transit
static-lsp transit LSP2 incoming-interface GigabitEthernet2/0/0 in-label 30 nexthop 10.1.1.1 out-label 60 //配置本节点为指定LSP2的Transit
#
return
LSR_3:
#
sysname LSR_3
#
mpls lsr-id 10.10.1.3
mpls
#
interface GigabitEthernet1/0/0
ip address 10.2.1.2 255.255.255.0
mpls
#
interface LoopBack1
ip address 10.10.1.3 255.255.255.255
#
ospf 1
area 0.0.0.0
network 10.2.1.0 0.0.0.255
network 10.3.1.0 0.0.0.255
network 10.10.1.3 0.0.0.0
#
static-lsp ingress LSP2 destination 10.3.1.0 24 nexthop 10.2.1.1 out-label 30 //配置本节点为指定LSP2的Ingress
static-lsp egress LSP1 incoming-interface GigabitEthernet1/0/0 in-label 40 //配置本节点为指定LSP1的Egress
#
return
1、配置静态LSP时需要遵循的原则是:前一节点出标签的值等于下一个节点入标签的值
2、配置静态LSP时,需要注意配置的静态LSP的路由一定要和路由信息完全匹配。
3、如果在配置静态LSP时指定了下一跳,则在配置IP静态路由时也必须指定下一跳,否则不能建立静态LSP。
4、如果LSR之间使用动态路由协议互通,则LSP的下一跳IP地址必须与路由表中的下一跳IP地址一致。
1、在LSR上执行命令display mpls static-lsp,可以看到LSP的Status为Up。
2、企业分支与总部可以相互Ping通。
LSP的建立过程实际就是将 FEC 和标签进行绑定,并将这种绑定通告 LSP上相邻LSR。这个过程是通过 LDP实现的。下面结合下游自主标签发布方式和有序标签控制方式来说明其主要步骤:
1. 当网络的路由改变时,如果有一个边缘节点发现自己的路由表中出现了新的目的地址,并且这一地址不属于任何现有的 FEC,则该边缘节点需要为这一目的地址建立一个新的 FEC。
2. 如果 MPLS 网络的出节点有可供分配的标签,则为 FEC 分配标签,并主动向上游发出标签映射消息,标签映射消息中包含分配的标签等信息;
3. 收到标签映射消息的 LSR 在其标签转发表中增加相应的条目,然后主动向上游LSR 发送标签映射消息;
4. 当入节点 LSR 收到标签映射消息时,它也需要在标签转发表中增加相应的条目。这时,就完成了 LSP 的建立,接下来就可以对该 FEC 对应的数据分组进行标签转发了。
LSP的建立过程:
当边缘节点(Eggress)发现自己的路由表出现了新的主机路由,并且这一路由不属于任何现有的FEC,则该Eggress需要位这一路由建立一个新的FEC
如果此Egress有可供分配的标签,则为FEC分配标签,并主动向上游发出标签映射消息(包含分配的标签和绑定的FEC等信息)
中间节点(Transit)收到标签映射消息后,判断标签映射信息的发送者(Egress)是否为该FEC的下一跳,若是,则在其标签转发表中增加相应的条目,然后主动向上游LSR发送对于指定FEC的标签映射消息
边缘节点(Ingress)收到标签映射消息后,判断标签映射的发送者(Transit)是否为该FEC的下一跳,若是,则在其标签转发表中增加相应的条目。
此时,LSP完成建立,接下来就可以对该FEC对应的数据报文进行标签转发
PE和P为MPLS骨干网设备,PE_1和PE_2之间路由可达。如下图所示。
企业现要求分支和总部之间的流量通过MPLS转发,并且当主用LSP故障时,流量能够快速切换到备份LSP,尽可能地避免流量的丢失。另外,为了避免建立的LSP数量过多,影响设备性能,所有设备上只允许目的地址为10.10.1.x/32、10.6.1.0/24和10.7.1.0/24的路由表项触发建立LSP,其他路由表项不能触发建立LSP。

PE_1:
#
sysname PE_1
#
bfd //全局使能BFD功能
#
mpls lsr-id 10.10.1.1 //配置MPLS LSR ID
mpls //使能全局MPLS功能
lsp-trigger ip-prefix pe1 //根据IP地址前缀列表触发LDP建立LSP
mpls bfd enable //使能BFD功能
mpls bfd-trigger fec-list tortc //指定LDP BFD以FEC列表方式触发
mpls bfd min-tx-interval 100 min-rx-interval 100
#
fec-list tortc //创建FEC列表
fec-node 10.10.1.2
#
mpls ldp //使能全局MPLS LDP功能
#
interface GigabitEthernet1/0/0 //使能接口MPLS LDP功能
ip address 10.1.1.1 255.255.255.0
mpls
mpls ldp
#
interface GigabitEthernet2/0/0
ip address 10.3.1.1 255.255.255.0
mpls
mpls ldp
#
interface GigabitEthernet3/0/0
ip address 10.6.1.1 255.255.255.0
#
interface LoopBack1
ip address 10.10.1.1 255.255.255.255
#
ospf 1 //配置OSPF路由
area 0.0.0.0
network 10.1.1.0 0.0.0.255
network 10.3.1.0 0.0.0.255
network 10.6.1.0 0.0.0.255
network 10.10.1.1 0.0.0.0
#
ip ip-prefix pe1 index 10 permit 10.10.1.1 32 //创建IP地址前缀列表
ip ip-prefix pe1 index 20 permit 10.10.1.2 32
ip ip-prefix pe1 index 30 permit 10.10.1.3 32
ip ip-prefix pe1 index 40 permit 10.10.1.4 32
ip ip-prefix pe1 index 50 permit 10.10.1.5 32
ip ip-prefix pe1 index 60 permit 10.6.1.0 24
ip ip-prefix pe1 index 70 permit 10.7.1.0 24
#
return
P_1
#
sysname P_1
#
mpls lsr-id 10.10.1.3 //配置MPLS LSR ID
mpls //使能全局MPLS功能
#
mpls ldp //使能全局MPLS LDP功能
#
interface GigabitEthernet1/0/0 //使能接口MPLS LDP功能
ip address 10.1.1.2 255.255.255.0
mpls
mpls ldp
#
interface GigabitEthernet2/0/0
ip address 10.2.1.1 255.255.255.0
mpls
mpls ldp
#
interface LoopBack1
ip address 10.10.1.3 255.255.255.255
#
ospf 1 //配置OSPF路由
area 0.0.0.0
network 10.1.1.0 0.0.0.255
network 10.2.1.0 0.0.0.255
network 10.10.1.3 0.0.0.0
#
return
P_2:
#
sysname P_2
#
mpls lsr-id 10.10.1.4 //配置MPLS LSR ID
mpls //使能全局MPLS功能
#
mpls ldp //使能全局MPLS LDP功能
#
interface GigabitEthernet1/0/0 //使能接口MPLS LDP功能
ip address 10.3.1.2 255.255.255.0
mpls
mpls ldp
#
interface GigabitEthernet2/0/0
ip address 10.4.1.1 255.255.255.0
mpls
mpls ldp
#
interface LoopBack1
ip address 10.10.1.4 255.255.255.255
#
ospf 1 //配置OSPF路由
area 0.0.0.0
network 10.3.1.0 0.0.0.255
network 10.4.1.0 0.0.0.255
network 10.10.1.4 0.0.0.0
#
return
P_3:
#
sysname P_3
#
mpls lsr-id 10.10.1.5 //配置MPLS LSR ID
mpls //使能全局MPLS功能
#
mpls ldp //使能全局MPLS LDP功能
#
interface GigabitEthernet1/0/0 //使能接口MPLS LDP功能
ip address 10.4.1.2 255.255.255.0
mpls
mpls ldp
#
interface GigabitEthernet2/0/0
ip address 10.5.1.1 255.255.255.0
mpls
mpls ldp
#
interface LoopBack1
ip address 10.10.1.5 255.255.255.255
#
ospf 1 //配置OSPF路由
area 0.0.0.0
network 10.4.1.0 0.0.0.255
network 10.5.1.0 0.0.0.255
network 10.10.1.5 0.0.0.0
#
return
PE_2:
#
sysname PE_2
#
bfd //全局使能BFD功能
mpls-passive //使能被动创建BFD会话功能
#
mpls lsr-id 10.10.1.2 //配置MPLS LSR ID
mpls //使能全局MPLS功能
lsp-trigger ip-prefix pe2 //根据IP地址前缀列表触发LDP建立LSP
#
mpls ldp //使能全局MPLS LDP功能
#
interface GigabitEthernet1/0/0 //使能接口MPLS LDP功能
ip address 10.2.1.2 255.255.255.0
mpls
mpls ldp
#
interface GigabitEthernet2/0/0
ip address 10.5.1.2 255.255.255.0
mpls
mpls ldp
#
interface GigabitEthernet3/0/0
ip address 10.7.1.1 255.255.255.0
#
interface LoopBack1
ip address 10.10.1.2 255.255.255.255
#
ospf 1 //配置OSPF路由
area 0.0.0.0
network 10.2.1.0 0.0.0.255
network 10.5.1.0 0.0.0.255
network 10.7.1.0 0.0.0.255
network 10.10.1.2 0.0.0.0
#
ip ip-prefix pe2 index 10 permit 10.10.1.1 32 //创建IP地址前缀列表
ip ip-prefix pe2 index 20 permit 10.10.1.2 32
ip ip-prefix pe2 index 30 permit 10.10.1.3 32
ip ip-prefix pe2 index 40 permit 10.10.1.4 32
ip ip-prefix pe2 index 50 permit 10.10.1.5 32
ip ip-prefix pe2 index 60 permit 10.6.1.0 24
ip ip-prefix pe2 index 70 permit 10.7.1.0 24
#
return
1、在LSR上执行命令display mpls ldp lsp,可以看到去往对应目的地址的LSP已经建立。将同一台测试仪的两个接口(Port1和Port2)分别接入PE_1和PE_2,从Port1向Port2打MPLS流。当对P_1的GE1/0/0接口进行shutdown操作来模拟主用LSP故障时,发现流量快速切换到备份LSP。
2、企业分支与总部可以相互Ping通。
3、配置LSR ID是配置其它MPLS命令的前提。
4、MPLS是基于路由来建立LSP,需确保路由可达。
企业分支和总部通过MPLS网络进行互联。要求创建一条沿显式路径:LSR_1→LSR_2→LSR_3→LSR_4的主隧道。在中间节点LSR_2上配置一条TE FRR的旁路保护隧道,路径为LSR_2→LSR_5→LSR_3,并在入节点LSR_1上配置普通备份CR-LSP,路径为LSR_1→LSR_6→LSR_3→LSR_4。当LSR_2和LSR_3之间的链路出现故障后,设备启用TE FRR旁路保护隧道(即主CR-LSP处于Frr-in-use状态)并尝试恢复主CR-LSP的同时,也会尝试创建备份CR-LSP。组网图如下:

LSR_1:
#
sysname LSR_1
#
bfd //使能BFD功能
#
mpls lsr-id 10.10.1.9
mpls //使能MPLS TE
mpls te
mpls rsvp-te
mpls te cspf
#
explicit-path backup-path //配置备份CR-LSP的显式路径
next hop 10.6.1.2
next hop 10.7.1.2
next hop 10.3.1.2
next hop 10.10.4.9
#
explicit-path pri-path //配置主CR-LSP的显式路径
next hop 10.1.1.2
next hop 10.2.1.2
next hop 10.3.1.2
next hop 10.10.4.9
#
interface GigabitEthernet1/0/0 //使能接口MPLS TE
ip address 10.1.1.1 255.255.255.0
mpls
mpls te
mpls rsvp-te
#
interface GigabitEthernet2/0/0
ip address 10.6.1.1 255.255.255.0
mpls
mpls te
mpls rsvp-te
#
interface LoopBack1
ip address 10.10.1.9 255.255.255.255
#
interface Tunnel0/0/1 //配置主CR-LSP的MPLS TE隧道接口
ip address unnumbered interface LoopBack1
tunnel-protocol mpls te
destination 10.10.4.9
mpls te tunnel-id 100
mpls te bfd enable //配置动态BFD for CR-LSP功能
mpls te bfd min-tx-interval 500 min-rx-interval 500
mpls te record-route label
mpls te path explicit-path pri-path
mpls te path explicit-path backup-path secondary
mpls te fast-reroute //使能TE FRR功能
mpls te backup ordinary
mpls te backup frr-in-use
mpls te commit
#
ospf 1 //配置OSPF路由
opaque-capability enable
area 0.0.0.0
network 10.1.1.0 0.0.0.255
network 10.6.1.0 0.0.0.255
network 10.10.1.9 0.0.0.0
mpls-te enable
#
return
LSR_2:
#
sysname LSR_2
#
mpls lsr-id 10.10.2.9
mpls //使能MPLS TE
mpls te
mpls rsvp-te
mpls te cspf
#
explicit-path by-path //配置Bypass CR-LSP的显式路径
next hop 10.4.1.2
next hop 10.5.1.2
next hop 10.10.3.9
#
interface GigabitEthernet1/0/0 //使能接口MPLS TE
ip address 10.1.1.2 255.255.255.0
mpls
mpls te
mpls rsvp-te
#
interface GigabitEthernet2/0/0
ip address 10.2.1.1 255.255.255.0
mpls
mpls te
mpls rsvp-te
#
interface GigabitEthernet3/0/0
ip address 10.4.1.1 255.255.255.0
mpls
mpls te
mpls rsvp-te
#
interface LoopBack1
ip address 10.10.2.9 255.255.255.255
#
interface Tunnel0/0/2 //配置Bypass CR-LSP的隧道接口
ip address unnumbered interface LoopBack1
tunnel-protocol mpls te
destination 10.10.3.9
mpls te tunnel-id 300
mpls te record-route
mpls te path explicit-path by-path
mpls te bypass-tunnel
mpls te protected-interface GigabitEthernet2/0/0
mpls te commit
#
ospf 1 //配置OSPF路由
opaque-capability enable
area 0.0.0.0
network 10.1.1.0 0.0.0.255
network 10.2.1.0 0.0.0.255
network 10.4.1.0 0.0.0.255
network 10.10.2.9 0.0.0.0
mpls-te enable
#
return
LSR_3:
#
sysname LSR_3
#
bfd //使能被动创建BFD会话
mpls-passive
#
mpls lsr-id 10.10.3.9
mpls //使能MPLS TE
mpls te
mpls rsvp-te
#
interface GigabitEthernet1/0/0 //使能接口MPLS TE
ip address 10.2.1.2 255.255.255.0
mpls
mpls te
mpls rsvp-te
#
interface GigabitEthernet2/0/0
ip address 10.3.1.1 255.255.255.0
mpls
mpls te
mpls rsvp-te
#
interface GigabitEthernet3/0/0
ip address 10.5.1.2 255.255.255.0
mpls
mpls te
mpls rsvp-te
#
interface GigabitEthernet4/0/0
ip address 10.7.1.2 255.255.255.0
mpls
mpls te
mpls rsvp-te
#
interface LoopBack1
ip address 10.10.3.9 255.255.255.255
#
ospf 1 //配置OSPF路由
opaque-capability enable
area 0.0.0.0
network 10.2.1.0 0.0.0.255
network 10.3.1.0 0.0.0.255
network 10.5.1.0 0.0.0.255
network 10.7.1.0 0.0.0.255
network 10.10.3.9 0.0.0.0
mpls-te enable
#
return
LSR_4
#
sysname LSR_4
#
mpls lsr-id 10.10.4.9
mpls //使能MPLS TE
mpls te
mpls rsvp-te
#
interface GigabitEthernet1/0/0 //接口使能MPLS TE
ip address 10.3.1.2 255.255.255.0
mpls
mpls te
mpls rsvp-te
#
interface LoopBack1
ip address 10.10.4.9 255.255.255.255
#
ospf 1 //配置OSPF路由
opaque-capability enable
area 0.0.0.0
network 10.3.1.0 0.0.0.255
network 10.10.4.9 0.0.0.0
mpls-te enable
#
return
LSR_5
#
sysname LSR_5
#
mpls lsr-id 10.10.5.9
mpls //使能MPLS TE
mpls te
mpls rsvp-te
#
interface GigabitEthernet1/0/0 //接口使能MPLS TE
ip address 10.4.1.2 255.255.255.0
mpls
mpls te
mpls rsvp-te
#
interface GigabitEthernet2/0/0
ip address 10.5.1.1 255.255.255.0
mpls
mpls te
mpls rsvp-te
#
interface LoopBack1
ip address 10.10.5.9 255.255.255.255
#
ospf 1 //配置OSPF路由
opaque-capability enable
area 0.0.0.0
network 10.4.1.0 0.0.0.255
network 10.5.1.0 0.0.0.255
network 10.10.5.9 0.0.0.0
mpls-te enable
#
return
LSR_6
#
sysname LSR_6
#
mpls lsr-id 10.10.6.9
mpls //使能MPLS TE
mpls te
mpls rsvp-te
#
interface GigabitEthernet1/0/0 //接口使能MPLS TE
ip address 10.6.1.2 255.255.255.0
mpls
mpls te
mpls rsvp-te
#
interface GigabitEthernet2/0/0
ip address 10.7.1.1 255.255.255.0
mpls
mpls te
mpls rsvp-te
#
interface LoopBack1
ip address 10.10.6.9 255.255.255.255
#
ospf 1 //配置OSPF路由
opaque-capability enable
area 0.0.0.0
network 10.6.1.0 0.0.0.255
network 10.7.1.0 0.0.0.255
network 10.10.6.9 0.0.0.0
mpls-te enable
#
return
配置验证
将LSR_2的GE2/0/0接口Shutdown后,在LSR_1上执行display mpls te tunnel-interface命令,可以看到隧道状态为“Up”,说明主隧道处于Frr-in-use状态的同时,正在创建普通备份的CR-LSP和恢复主CR-LSP。即当主CR-LSP故障后,系统启用TE FRR旁路保护隧道(即主CR-LSP处于Frr-in-use状态)并尝试恢复主CR-LSP的同时,也会尝试创建备份CR-LSP。
注意事项
1、在采用RSVP-TE动态建立CR-LSP时,必须配置IGP的TE扩展(目前支持OSPF TE和ISIS TE)。在不配置IGP的TE扩展时计算出的路径是由IGP路由得到的,而不是CSPF计算出来的。
2、只有使用RSVP-TE信令协议建立的MPLS TE隧道支持FRR功能。
3、同一个Tunnel接口不能同时作为旁路隧道和备份隧道。
4、同一个Tunnel接口不能同时作为旁路隧道和主隧道。
5、配置旁路隧道时,需要先规划好它所保护的链路或节点,并确保该旁路隧道不会经过它所保护的链路或节点,否则不能真正起到保护作用。
我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub
我正在使用puppet为ruby程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这
我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是
我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search
我在理解Enumerator.new方法的工作原理时遇到了一些困难。假设文档中的示例:fib=Enumerator.newdo|y|a=b=1loopdoy[1,1,2,3,5,8,13,21,34,55]循环中断条件在哪里,它如何知道循环应该迭代多少次(因为它没有任何明确的中断条件并且看起来像无限循环)? 最佳答案 Enumerator使用Fibers在内部。您的示例等效于:require'fiber'fiber=Fiber.newdoa=b=1loopdoFiber.yieldaa,b=b,a+bendend10.times.m
我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden
question的一些答案关于redirect_to让我想到了其他一些问题。基本上,我正在使用Rails2.1编写博客应用程序。我一直在尝试自己完成大部分工作(因为我对Rails有所了解),但在需要时会引用Internet上的教程和引用资料。我设法让一个简单的博客正常运行,然后我尝试添加评论。靠我自己,我设法让它进入了可以从script/console添加评论的阶段,但我无法让表单正常工作。我遵循的其中一个教程建议在帖子Controller中创建一个“评论”操作,以添加评论。我的问题是:这是“标准”方式吗?我的另一个问题的答案之一似乎暗示应该有一个CommentsController参
几个月前,我读了一篇关于rubygem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题: