博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Learn Rails5.2 Routes。( 很少用到的参数:constraints和redirect)
阅读量:5054 次
发布时间:2019-06-12

本文共 2712 字,大约阅读时间需要 9 分钟。

Naming a Route

 

get 'home/index', as: "different_name"

会得到prefix: different_name代替home_index, 这个是路径的名字。

 

get 'home/ping', to: "home#pong" 

to方法,定义到哪个控制器的哪个action。 这会改变默认的控制器的action。而控制器会指向view。

 


 

 

Paramter 

 

通过浏览器输入的URI Pattern ,可以导向控制器的某个action

 

在router.rb中

  resources :posts
  get ':year(/:month(/:day))', to: 'posts#index'

 

Verb  URI Pattern               Controller#Action
GET    /:year(/:month(/:day))(.:format)		 posts#index

 

解释:这里参数:year是必须的,括号里的是可选的。

http://localhost:3000/2018/01/01 

Started GET "/2018/01/01" for 127.0.0.1 at 2018-06-18 09:52:25 +0800
Processing by PostsController#index as HTML
 
Parameters: {"year"=>"2018", "month"=>"01", "day"=>"01"}
  Rendering posts/index.html.erb within layouts/application
  Post Load (0.1ms)  SELECT "posts".* FROM "posts"
  ↳ app/views/posts/index.html.erb:16
  Rendered posts/index.html.erb within layouts/application (1.8ms)
Completed 200 OK in 39ms (Views: 37.7ms | ActiveRecord: 0.1ms)

 

解释:在controller的index动作中, 你可以利用params[]来存取定义在URL中的值。 

valid_date?方法,找不到出处?

  def index
    if
Date.valid_date?(params[:year].to_i, params[:month].to_i, params[:day].to_i)
      start_date =
Date.parse("#{params[:day]}.#{params[:month]}.#{params[:year]}")
      end_date = start_date
    elsif Date.valid_date?(params[:year].to_i, params[:month].to_i, 1)
      start_date = Date.parse("1.#{params[:month]}.#{params[:year]}")
      end_date = start_date.end_of_month
    elsif params[:year] && Date.valid_date?(params[:year].to_i, 1, 1)
      start_date = Date.parse("1.1.#{params[:year]}")
      end_date = start_date.end_of_year
    end
    if start_date && end_date
      @posts = Post.where(published_on: start_date..end_date)
    end
  end

 


constraints(constraints={}) 

用于限制url

  get ':year(/:month(/:day))', to: 'posts#index' , constraints: {year: /\d{4}/, month: /\d{2}/, day: /\d{2}/ }
也可以接受块:

 constraints(id: /\d+\.\d+/) do

   resources :posts

 end 

加入?后,id只能输入1.1或者10.11的格式,否则会报告Routing Error. 

 


Redirect(*args, &block)方法 

用于返回到其他path。设置比较复杂。

  get ':year/:month/:day',
to: redirect("/%{year}/0%{month}/0%{day}"),
constraints: { year: /\d{4}/, month: /\d{1}/, day: /\d{1}/ }

 还必须加上?,否则不能导航到控制器的index动作。

  get ':year(/:month(/:day))', to: 'posts#index', constraints: {year: /\d{4}/, month: /\d{2}/, day: /\d{2}/ }
 

我的理解:第一行代码是返回到第二行代码的路径,然后再指向控制器的index动作。 


 only和except方法:用做resources的参数。


 

Nested  Resources

 

如果使用scaffold在改router.rb后,先修改路径:

  resources :posts do

 

    resources :comments
  end

 

然后根据路径对控制器行为修改:

  1.  before_action :set_post #@post = Post.find(params[:post_id])
  2. index, new, create, update, destroy都需要修改。

 

最后是视图view还需要对comments/*.html.erb全部修改。包括参数的传递,连接的修改。删除没用的表格的字段。

 


 

shallow resources就是一个便捷的路径写法。

  resources :posts do
    resources :comments, only:[:index, :new, :create]
  end
  resources :comments, except:[:index, :new, :create]

无需细记。 

 

转载于:https://www.cnblogs.com/chentianwei/p/9194755.html

你可能感兴趣的文章
iOS 日常工作之常用宏定义大全
查看>>
PHP的SQL注入技术实现以及预防措施
查看>>
MVC Razor
查看>>
软件目录结构规范
查看>>
Windbg调试Sql Server 进程
查看>>
linux调度器系列
查看>>
mysqladmin
查看>>
解决 No Entity Framework provider found for the ADO.NET provider
查看>>
SVN服务器搭建和使用(三)(转载)
查看>>
Android 自定义View (三) 圆环交替 等待效果
查看>>
设置虚拟机虚拟机中fedora上网配置-bridge连接方式(图解)
查看>>
HEVC播放器出炉,迅雷看看支持H.265
查看>>
[置顶] Android仿人人客户端(v5.7.1)——人人授权访问界面
查看>>
Eclipse 调试的时候Tomcat报错启动不了
查看>>
【安卓5】高级控件——拖动条SeekBar
查看>>
ES6内置方法find 和 filter的区别在哪
查看>>
Android入门之文件系统操作(二)文件操作相关指令
查看>>
Android实现 ScrollView + ListView无滚动条滚动
查看>>
Swift 中的指针使用
查看>>
Swift - 使用闭包筛选过滤数据元素
查看>>