原创,转载请注明http://www.cnblogs.com/juandx/p/3963023.html

 rails中path、url路径解析,routes信息,form_for剖析,link_to示例

1、首先要了解routes中resources的member、collection、new的关系 =>

http://www.cnblogs.com/juandx/articles/3962694.html

2、然后在cmd中rake routes要看懂

C:\Users\Administrator\Desktop\lianxizhong\lianxi1_form_for\depot>bundle exec ra
ke routes
orders_index GET /orders/index(.:format) orders#index
xshow_order GET /orders/:id/xshow(.:format) orders#xshow
xcreate_orders POST /orders/xcreate(.:format) orders#xcreate
orders GET /orders(.:format) orders#index
POST /orders(.:format) orders#create
new_order GET /orders/new(.:format) orders#new
edit_order GET /orders/:id/edit(.:format) orders#edit
order GET /orders/:id(.:format) orders#show
PUT /orders/:id(.:format) orders#update
DELETE /orders/:id(.:format) orders#destroy

  第一列指路径名称,比如第二个xshow_order   这样就可以引用xshow_order_path 和 xshow_order_url 了,不然当你随便乱用_path和_url的时候就会提示

                       undefined local variable or method `xcreate_orderss_path' for #<#<Class:0x42d8600>:0x3791190>

  第二列是对应的http verb选项

  第三列是对应路径

  第四列是对应控制器和其中的方法,比如orders#xshow中就是这个路径要对应到orderscontroller 中的 xshow方法

3、实例解释

先看一下代码

orderscontroller.rb

class OrdersController < ApplicationController
def index
flash.now[:notice] = 'Message sent!'
@order = Order.all
end def new
@order12 = Order.new
end def create
flash.now[:notice] = "bb"
@order = Order.new(params[:order])
if @order.save
flash[:notice] = "yes"
redirect_to :action => 'index'
else
flash.now[:alert] = "no"
end
end def xcreate
flash.now[:notice] = "bb"
@order = Order.new(params[:order])
if @order.save
flash[:notice] = "yes"
redirect_to :action => 'index'
else
flash.now[:alert] = "no"
end
end def show
@order = Order.find(params[:id])
end def xshow
@order = Order.find(params[:id])
end end

  

routes.rb

Depot::Application.routes.draw do
get "orders/index" resources :orders do
get 'xshow', on: :member
post 'xcreate', on: :collection
end end

  

index.html.erb

<h1>hello,rails </h1>

<% @order.each do |oo| %>
<div>
<%= oo.name %>   <%= link_to 'see', xshow_order_path(oo) %><br/>
<%= sanitize(oo.des) %>
</div> <% end %> <br/>
<br/> <%= link_to "create" , new_order_path %>

  

new.html.erb

<%= form_for @order12 , url: xcreate_orderss_path do |f| %>
<div>
<%= f.label "Name is" %><br />
<%= f.text_field :name, :size => 40 %>
</div>
<div>
<%= f.label :Description %><br />
<%= f.text_area :des, :rows => 3, :cols => 40 %>
</div>
<div>
<%= f.submit 'Place Order' %>
</div>
<% end %>

  

show.html.erb

<p>
<b>Name:</b>
<%=h @order.name %>
</p> <p>
<b>Description:</b>
<%= @order.des %>
</p> <%= link_to 'Back', orders_path %>

  

  好了,最后的show和xshow是一样的,create和xcreate是一样的,目的就是想学习下路由而已

注意了,

(1)、先看看form_for的构造吧:

在controller中new方法中@order12 = Order.new,这样就会把一个实例传给new.html.erb中的那个表单,这样表单就能根据@order12中的属性来构造:

比如<%= f.text_field :name, :size => 40 %>中的name就是@order12中的name属性,必须一一对应。

然后在表单中填完数据后要发送给一个地址,然后执行post请求,所以在表单第一行就写好了<%= form_for @order12 , url: xcreate_orders_path do |f| %>

说明写完数据后,最后submit是到xcreate_order_path的路径,看看那个cmd中的路由就知道是到了orderscontroller中的xcreate方法。所以如果不用path写法也可以直接写成

<%= form_for @order12 , url: {:action => "xcreate"} do |f| %>。这样之后就可以直接让xcreate中执行post请求了(就是 @order.save)。在controller中的xcreate方法中        的@order = Order.new(params[:order]),就是因为new.html.erb中最后submit后的是一个params[:order],而不是刚刚的@order12了,这里写成不同就是为了区别。

其实默认的是new.html.erb之后直接对应到controller中的create,后台代码我还没读,但是,默认的url是到create的,所以你什么都不写的话,如<%= form_for @order12 do |f|     %>,然后在controller中的create中用 @order.save就可以保存信息到数据库里了,所以我这里为了验证就新建了一个xcreate方法了。

(2)、link_to

在index.html.erb中,可以看到<%= oo.name %>&nbsp;&nbsp;&nbsp;<%= link_to 'see', xshow_order_path(oo) %><br/>,这样就建了一个连接,因为在routes中用       的是member方法,所以这样就可以传递参数进去了。当然,如果什么path都不写,一开始的话是默认到show的。。。这应该也是rails后台默认的吧。。。所以在web敏捷开发里就是这       样<%= oo.name %>&nbsp;&nbsp;&nbsp;<%= link_to 'show', oo %><br/>了。。。

当然不用path写法也可以直接写,但是要对应好rake routes中的路由路径信息  比如路径信息是   xshow_order GET    /orders/:id/xshow(.:format) orders#xshow,那么就要       这样写:<%= link_to 'see', {:controller => "orders",:id => oo, :action => "xshow"} %>

4、对routes中的resources写法补充

Example::Application.routes.draw do

  resources :vmc_vstores

  resources :vdisks do
get 'download', on: :member
end resources :vstores do
member do
get 'volumn_vdisk_info'
post 'do_unmount_cdrom_vdisk'
end
get 'topo', on: :collection
end namespace :admins do
resources :users do
get 'lock', on: :member
get 'unlock', on: :member
end resources :roles match ':controller(/:action(/:id))(.:format)'
end

  

rails中path、url路径解析,routes信息,form_for剖析,link_to示例,路由实例说明的更多相关文章

  1. iOS 检测文本中的 URL、电话号码等信息

    iOS 检测文本中的 URL.电话号码等信息 要检测文本中的 URL.电话号码等,除了用正则表达式,还可以用 NSDataDetector. 用 NSTextCheckingResult.Checki ...

  2. node中的url模块解析结果

    1. URL模块作用: url 模块用于处理与解析 URL. 使用方法如下: const url = require('url'); 2. URL 字符串与 URL 对象 URL 字符串是结构化的字符 ...

  3. # node中的url常用方法解析

    url字符串是一个结构化的字符串,由好几个有意义部分组成.我们在工作中不可避免的会用到其中的某个部分,最原始的通过字符串截取和正则匹配的方法难免用起来会不太方便和美观,所以在我们的nodejs中提供了 ...

  4. django的url反向解析

    目的:防止页面中url地址改变,其他与这个URL地址有关联的都要改,减少耦合度 使用:主要分为在html中和视图函数中的使用 HTML中的使用: 如果我们在项目的url文件中通过include导入了应 ...

  5. 解决 U2000 R017 安装报错: 检查SQL server数据库环境变量信息 ( 异常 ) [ 详细信息 ] PATH环境变量中缺少数据库路径的信息

    U2000 R017 安装报错: 检查SQL server数据库环境变量信息 ( 异常 ) [ 详细信息 ] PATH环境变量中缺少数据库路径的信息 管理员模式打开注册表位置: HKEY_LOCAL_ ...

  6. 「Python 编程」编码实现网络请求库中的 URL 解析器

    摘要:怎么写出更短的代码并不是这次要讨论的话题.今天我们来研究一下:运行代码的计算机是如何找到目标服务器的? 相信各位 Python 开发者都用过 Requests 库,有些朋友还用过 WebSock ...

  7. jsp中如何获得url路径和绝对路径

    jsp中如何获得url路径 request.getHeader("referer") JSP中获得当前应用的相对路径和绝对路径 根目录所对应的绝对路径:request.getReq ...

  8. Django中URL的解析和反查

    add by zhj: 如果想用reverse(namespace1:namespace2:...:namespaceN:name)反查url(注意:用reverse('polls:index')方法 ...

  9. CSS样式表、JS脚本加载顺序与SpringMVC在URL路径中传参数与SpringMVC 拦截器

    CSS样式表和JS脚本加载顺序 Css样式表文件要在<head>中先加载,这样网页显示时可以第一次就渲染出正确的布局和样式,网页就不会闪烁,或跳变 JS脚本尽可能放在<body> ...

随机推荐

  1. lsnrctl: error while loading shared libraries: /opt/app/oracle/product/11.2/db_1/lib/libclntsh.so.11

    错误描述: 安装好数据库后,在oralce用户下敲入 查看监听状态命令,返回错误提示 [oracle@centos3 ~]$ lsnrctl statuslsnrctl: error while lo ...

  2. python练习笔记——用函数对列表奇偶分类,且过程不增加新列表

    编写一个函数:函数接收一个列表,将列表中所有的奇数,放到偶数之前,要求过程中不增加新的列表 def fun(*args): # 因为奇数放在偶数之前,标记出奇数中的偶数 # 并将该偶数取出放在数列的最 ...

  3. System V 共享内存区

    1.概述 系统调用mmap通过映射一个普通文件实现共享内存.System V 则是通过映射特殊文件系统shm中的文件实现进程间的共享内存通信.也就是说,每个共享内存区域对应特殊文件系统shm中的一个文 ...

  4. Factory - 工厂模式

    在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一 ...

  5. VC获得window操作系统版本号, 获取操作系统位数

    原文链接: http://www.greensoftcode.net/techntxt/2014315195331643021849 #include <Windows.h>include ...

  6. map以自定义类型当Key

    关于map的定义: template < class Key, class T, class Compare = less<Key>, class Allocator = alloc ...

  7. json字符串序列化exception处理

    一.背景: 使用REST接口接收远端传送过来的Json格式String,需要把这个String序列化成响应的对象. 二.问题: 对方封装了一个错误的json格式过来,程序就挂了…… 三.似乎解决: 通 ...

  8. 17monipdb根据IP获得区域

    https://www.ipip.net/download.html https://github.com/17mon/csharp IpAndPositionHelper public class ...

  9. nodejs request gb2312乱码的问题

    http://www.cnblogs.com/linka/p/6658055.html https://cnodejs.org/topic/53142ef833dbcb076d007230 // np ...

  10. Angularjs Module类的介绍及模块化依赖

    后面的学习我们会遵循一个控制器管理一个视图,一个路由对应一个视图的单一原则,所以再不会将controller控制器代码直接写到 index.html 中. 我们会应用到angular.js中强大的模块 ...