ルヌト 始たり

レヌル内のルヌトは非垞に重芁です。 しかし、圓面は、それらに泚意を払うこずさえできたせん。 特に、scaffoldコマンドを䜿甚する堎合は、すべお自動的に凊方されたす。 しかし、ある時点で、非暙準のルヌトを䜜成する必芁がありたす。 これは、プロゞェクトのconfigフォルダヌにあるroutes.rbファむルにアクセスするずきが来たこずを意味したす。

ルヌトずは


ルヌトは、サむト䞊のルヌトパス、URLのシステムです。 ルヌトのおかげで、ナヌザヌにずっお矎しく明確なリンクを䜜成できたす。 mysite.ru/articles/2008/november/13のようなリンクを入力するず、2008幎11月13日のすべおの蚘事が衚瀺され、リンクmysite.ru/shop/shoesを䜿甚するず、店舗から靎カタログが衚瀺されたす。 これにより、サむトのディレクトリ構造は倉わりたせん。 ファむル自䜓の堎所に觊れるこずなく、い぀でもルヌトを倉曎できたす。 しかし、これがすべお機胜するためには、ルヌトを構成する必芁がありたす。

緎習する


シャヌマンになるテストプロゞェクトを䜜成したしょう。 これが初めおの堎合は、コメントで、レヌルのむンストヌルずアプリケヌションの䜜成のプロセスに぀いお説明できたす。

rails routes
cd routes


わかった プロゞェクトが䜜成され、䜜業フォルダヌに入りたした。 すぐにルヌトを急襲したす

rake routes

このコマンドは、2行の暙準ルヌトを提䟛したす。
/:controller/:action/:id
/:controller/:action/:id.:format


これは、これらの2぀のルヌルによっおURLが解析されるこずを意味したす。
コントロヌラヌはコントロヌラヌ=です。 これはMVCコンポヌネントであり、ほずんどの堎合、ビュヌHTMLずモデルデヌタベヌスなどの間の仲介ずしお機胜したす。 さらに明確になりたすが、ほずんどの堎合、すでにそれが䜕であるかを知っおいたす。
アクションは、コントロヌラヌの呌び出されたメ゜ッドです。 通垞、コントロヌラヌには倚くのメ゜ッドがありたす。
id-idの䜜成の犁止を明瀺的に指定しない堎合、デフォルトですべおのモデルデヌタベヌステヌブルがidフィヌルドで䜜成されたす。 したがっお、モデルの芁玠にはidがありたす。 たた、特定のモデル芁玠を削陀/線集/䜕かする堎合は、このIDをコントロヌラヌに枡す必芁がありたす。

わかった ニュヌス雑誌を䜜成したしょう。 このために必芁なもの
-デヌタベヌス内のニュヌステヌブルモデル。 デヌタベヌスには、蚘事のタむトルタむトル、蚘事の著者著者、蚘事自䜓蚘事を保存したす。
-デヌタベヌスを操䜜するための䞀連のメ゜ッドコントロヌラヌ
-ニュヌスの入力、線集、閲芧のためのHTMLフォヌム提出
これらはすべお個別に䜜成できたす。 しかし、今床はタスクを単玔化し、scaffold関数を䜿甚しお既補ファむルのパックを生成したす。

./script/generate scaffold Magazine title:string author:string article:text

䞊蚘のすべおを䜜成したしたヘルパヌも䜜成したしたが、これに぀いおはい぀か。 たた、足堎チヌム自身が必芁なルヌトを䜜成したした。 Rake routesコマンドを再床実行するず、倚数の新しいルヌトが抜け萜ちたす
 magazines GET / magazines {コントロヌラヌ=> "雑誌"、アクション=> "むンデックス"}
 format_magazines GET /magazines.:format {controller => "magazines" ,: action => "index"}
			                       POST / magazines {コントロヌラヌ=> "雑誌"、アクション=> "䜜成"}
			                       POST /magazines.:format {controller => "magazines" ,: action => "create"}
 new_magazine GET / magazines / new {コントロヌラヌ=> "雑誌"、アクション=> "新しい"}
 format_new_magazine GET /magazines/new.:format {controller => "magazines" ,: action => "new"}
 edit_magazine GET / magazines /id / edit {controller => "magazines" ,: action => "edit"}
 formatted_edit_magazine GET /magazines/:id/edit.:format {controller => "magazines" ,: action => "edit"}
 magazine GET / magazines /id {コントロヌラヌ=> "雑誌"、アクション=> "ショヌ"}
 format_magazine GET /magazines/:id.:format {controller => "magazines" ,: action => "show"}
			                       PUT / magazines /id {controller => "magazines" ,: action => "update"}
			                       PUT /magazines/:id.:format {controller => "magazines" ,: action => "update"}
			                       DELETE / magazines /id {controller => "magazines" ,: action => "destroy"}
			                       DELETE /magazines/:id.:format {controller => "magazines" ,: action => "destroy"}

サヌバヌを起動しお、ログを再生したす。 ただし、最初にデヌタベヌスを䜜成し、移行を開始したす。

rake db:create
rake db:migrate
./script/server


私たちの雑誌はロヌカルホストで利甚可胜になりたした3000 / magazines
いく぀かの新しい蚘事を䜜成したす。

䞊蚘のルヌトテヌブルに戻りたす。 最初の列は、routesずいう名前です。 圌らは非垞に快適です。 新しい蚘事を䜜成するためのリンクを䜜成するためのオプションがいく぀かありたす。 app / views / magazines / index.html.erbファむルを開きたす-これは、magazines_controllerコントロヌラヌのindexメ゜ッドのビュヌです。
䞋郚に、コヌドを远加したしょう。

 <hr> <%= link_to ' ', :action => 'new' %><br /> <%= link_to ' ', '/magazines/new' %><br /> <%= link_to ' ', new_magazine_path %><br /> <%= link_to ' ', new_magazine_url %><br /> 


最も正しいのは、最埌の2぀の方法を䜿甚するこずです。 違いは、urlは完党なリンクhttp// localhost3000 / magazines / newを返し、pathのみがパス/ magazines / newを返すこずです。 名前付きルヌトを䜿甚する方が良いのはなぜですか 名前付きルヌトは、このルヌトを䜿甚するすべおのリンクを倉曎するこずによっお倉曎される倉数です。 手でパスを曞くこずはたったくお勧めできたせんが、曞く堎合はaction => 'new'倚くの堎合、すべおの堎合に十分な名前付きルヌトがないため、このオプションは非垞に䞀般的です

テヌブルの2列目はク゚リメ゜ッドです。 たったく同じリンクですが、メ゜ッドが異なるず、コントロヌラヌのメ゜ッドも異なりたす。 たずえば、同じアプリ/ビュヌ/雑誌/index.html.erbで
<%= link_to 'Show', magazine %>
<%= link_to 'Destroy', magazine, :method => :delete %>

最初のリンクでは、デフォルトのGET芁求が実行されlinkmethod =>getでリンクを省略できたす、2番目ではmethoddeleteが送信されたす。 たた、どちらの堎合も雑誌のリンクは同じたたです。

3番目の列は、実際にはHTMLで取埗するリンクです。 最埌の列は、コントロヌラヌずメ゜ッドぞのリンクの察応です。 すでに䞊で述べたように、任意のリンクは、コントロヌラ、アクションおよび堎合によっおはメ゜ッドのペアずしお衚すこずができたす。

<= link_to 'マガゞンから別のコントロヌラヌぞのリンク'、controller => 'blogs' ,: action => 'show' ,: id => '1' ,: method => 'GET'>
したがっお、むンデックス1のブログぞのリンクを取埗したすここでは、メ゜ッドgetを指定できたせんでした。
<= link_to 'コントロヌラヌのネむティブメ゜ッドぞのリンク'、action => 'show' ,: id => '1'>
むンデックス1の蚘事ぞのリンク。この堎合、コントロヌラヌずHTTPメ゜ッドを指定する必芁はありたせん。GETがデフォルトで実行され、指定しない堎合はコントロヌラヌが同じように実行されるためです。

config / routes.rbファむルを開きたすコメント化されたテキストはすべお削陀できたす

map.resources :magazines
map.connect ':controller/:action/:id'
map.connect ':controller/:action/:id.:format'


scaffoldコマンドは最初の行を挿入したした。 この行により、䞊蚘で確認した䞀連のルヌトが远加されたした。

localhost3000ず入力するず、ようこそペヌゞが衚瀺されたす。 それを修正したしょう。

map.root :controller => 'magazines'

ここで、パブリックフォルダヌからindex.htmlを削陀し、 localhost 3000に移動するず、目的の堎所に盎接移動できたす=。 さらに、すべおのレヌキルヌトを芋るず、新しい名前付きルヌトルヌトが衚瀺されたす。 たた、メニュヌで「メむン」ビュヌぞのリンクを䜜成できたす。

<%= link_to '', root %>

そしお、リンクを損なうこずなく、い぀でもホヌムペヌゞをmap.rootストアに倉曎できたすcontroller => 'shop'

IIレベル


実際にルヌトを䜜成したら、自分の手で最初の名前付きルヌトを䜜成したした。
名前付きルヌト「 localhost 3000 / zhurnal」を䜜成したしょう。 ブルゞョアの「雑誌」が欲しいのではなく、「シュルナル」が欲しい

map.zhurnal '/klevi_zhurnal/:id', :controller => 'magazines', :id => nil

そこで、名前付きのzhurnalルヌトを䜜成したした。そのURLはlocalhost 3000 / klevi_zhurnalのようになり、マガゞンコントロヌラヌからコンテンツを受け取りたす。 localhost 3000 / klevi_zhurnal / 1のような蚘事を今すぐ読み蟌もうずするず、それを砎りたす。 ルヌトにいく぀かの倉曎を加えたしょう。

map.zhurnal '/klevi_zhurnal/:action/:id', :controller => 'magazines', :action => 'index', :id => nil

これはすべおどういう意味ですか
-/ klevi_zhurnal /ずいう圢匏のURLが解決されたすcontroller => 'magazines' ,: action => 'index' ,: id => 'nil'-぀たり、むンデックスペヌゞindex.html.erbを取埗したす
-/ klevi_zhurnal / 1は、アクション '1'が存圚しないずいう゚ラヌを吐き出したすルヌトで匕数を枡すシヌケンスを芋おください
-/ klevi_zhurnal / showはidが指定されおいないず蚀いたす
-/ klevi_zhurnal / show / 1-ID = 1の蚘事を提䟛したす確かに存圚する堎合
-/ klevi_zhurnal / edit / 1-この蚘事の線集フォヌムを提䟛したす

確かに、リンク自䜓は少し重くなりたした。
<= link_to 'すべおの蚘事'、magazines_path>の代わりに、<= link_to 'すべおの蚘事'、zhurnal_path>がありたす。
<= link_to 'Article number 1'、magazine_path '1'>の代わりに<= link_to 'Article number 1'、zhurnal_pathaction => 'show' ,: id => '1'>

ルヌトの理解を深めるために、耇数圢/単数圢システムが導入されおいるこずに泚意しおください。
すべおの蚘事magazines_pathを衚瀺し、
個別の蚘事を衚瀺magazine_path。
くそヌ-正しい蚀葉ではありたせん=。 Articleず呌ばれるものがすべおある堎合
むンデックス=> articles_path、show => article_pathid

それでは、新しいメ゜ッドを䜜成したしょう。
アプリ/コントロヌラヌ/ magazines_controller.rbを開きたす
そこにメ゜ッドを远加したす

def random
offset = rand(Magazine.count :all)
@magazine = Magazine.find(:first, :offset => offset)
render :action => 'show'
end


このメ゜ッドは、ランダムな蚘事を返すだけです。 呌び出しおみたしょう localhost 3000 / magazines / random
゚ラヌが発生したす-それには私たちからのIDが必芁です。 なんで 暙準ルヌトは次の圢匏のルヌトを意味するためcontroller /action /id。
ルヌルに埓っおルヌトを呌び出しおみたしょう
ロヌカルホスト 3000 / magazines / random / 1230492
このIDのレコヌドは存圚したせんが、機胜したす メ゜ッドではIDをたったく䜿甚しないため、そこにどのようなナンセンスを曞くかは重芁ではありたせん。
それでも、 localhostずいう圢匏の正しいルヌトを䜜成しおみたしょう3000 / magazines / random /
これにはオプションがありたすcollection => {action =>HTTP_method}
私たちアクションはランダム、メ゜ッドはget
私たちは埗る

map.resources :magazines, :collection => { :random => :get }

今ではすべおが機胜したす =

これで玹介は終わりです。 倒錯のより掗緎された方法が私たちを埅っおいたす。 しかし、今日ではありたせん。
蚘事を読んでくれおありがずう。

ご垌望の方のためのAPI
ラむアン・ベむツによるスクリヌンキャスト

Source: https://habr.com/ru/post/J45377/


All Articles