Learn Rails5.2 Routes。( 很少用到的参数:constraints和redirect)

时间:2023-03-10 02:40:45
Learn Rails5.2 Routes。( 很少用到的参数:constraints和redirect)

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

加入