2016-07-11 19 views
0

私はRuby on Railsのnoobです。 Ruby on RailsでMichael Hartlのtutorialを使って作業しています。これまでのところ、静的なページについての第3章にあります。これまでのところ、私はhome,helpおよびaboutという3つのビューを持つStaticPageコントローラを持っています。コントローラのレイアウトはこのように書き:Ruby on Railsでの反復処理

<!DOCTYPE html> 
<html> 
    <head> 
    <title><%= yield(:title) %> | Sample App</title> 
    <%= csrf_meta_tags %> 

    <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> 
    <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %> 
    </head> 

    <body> 
    <%= yield %> 
    </body> 
</html> 

私が今やりたいことは、すべての静的ページへのリンクのすなわちリストをメニューバーを追加することです。これまでのところ、私は<body>タグでこのようなものがあります:

<ul> 
    <% '???'.each do |page| %> 
    <li>Page!</li> 
    <% end %> 
</ul> 

を私は'???'の代わりに置くために何を把握することはできません - 私は、コントローラのすべてのビューの反復子を必要とします。前もって感謝します。

答えて

0

あなたが求めているのは、静的ページを追加するだけではありません。動的に作成されたページを格納するためにmodelをバックアップしたデータベースと、collectionsを生成する機能を提供するmodelアクションを処理するcontrollerアクションが必要です。あなたはそのチュートリアルで作業しているので、あなたは、あなたがあなたのメニューバーをレンダリングするために必要なもの、

<ul> 
    <% '???'.each do |page| %> 
    <li><%= page %></li> 
    <% end %> 
</ul> 

のようなものを持つことができますcollections

この

<ul> 
    <li><%= link_to "Home", home_path %></li> 
    <li><%= link_to "Help", help_path %></li> 
    <li><%= link_to "About", about_path %></li> 
</ul> 
+0

うわー、それは私が思ったよりも難しいです!答えをくれてありがとうございますが、埋め込みRuby( '<%= page %> - <%= page.title(???))でページタイトル(私たちのコントローラのすべてのビューにあるシンボル' %> ')、データベース部分をより詳細に説明する(またはチュートリアルのどこにあるか教えてください) –

+1

チュートリアルを少しずつダイジェストして、これらのすべてがリストされている部分に行きます。 – ollaollu

0

であるあなたは、データベースから何かをレンダリングすることができますコントローラーに表示し、ビューで使用します。コントローラの場合と同様に、oneというメソッドに@ones = Something.allと書くことができます。コントローラのshowメソッドを引数に応じてデータベースから1つ表示すると、以下のようにリンクを追加できます私はsomething_show_path/:something_idになります。

<% @ones.each do |one|%> 
    <%= link_to "#{one}", something_show_path(@one) %> 
<% end %> 

しかし、この場合、データベースには静的ページのレコードはありません。ですから、ビューでそのような構文をしたい場合は、

def whatever 
    ```rest of the code```` 
    @pages = ["home", "about", "help"] 
end 

のようなコントローラで配列にそれらを追加し、ビューでは、あなたは、問題のため

<ul> 
    <% @pages.each do |p| %> 
     <li><%= link_to("#{p}", :controller => 'static_page', :action => "#{p}") %></li> 
    <% end %> 
</ul> 

編集を書くことができますコメント

class StaticPagesController < ApplicationController 

    before_filter :load_pages, :only => [:about, :home, :help] 

    ``` All your controller codes ``` 
    private 
    def load_pages 
     @pages = ["load", "about", "help"] 
    end 
end 

:onlyリスト内のすべてのメソッドは、ページをレンダリングする前にロードされ@pagesを持つようにします。それぞれのメソッドでロードする必要はありません。 ApplicationControllerでメソッドを宣言することができます。これは私がここで行い、before_filterを持つ任意のコントローラで呼び出すようなものです。

+0

コントローラーに@pagesを追加するには?私は 'ApplicationController 'に宣言を入れようとしました。初期化 'を実行しますが、ビュー内のコードは何も表示しません。 (エラーはありませんが、リスト項目もありません) –

+0

これを行うにはいくつかの方法があります。最も簡単ではないアプローチは、使用しようとしていたグローバル変数を設定することです。変数の前に '@'記号を使用しないでください。 '$ '記号を追加してください。そして、あなたはinitializeメソッドの中にそれを持つ必要はありません。すべてのメソッドの外に書いてください。 – tworitdash

+0

「$ post = ["about"、 "help"] '' 'と似ています。あるいは、各メソッドを呼び出す前に、コントローラ自身で呼び出されるプライベートメソッドを定義できます。 before_filter:load_pages、:only => [:about、:home、:help] '' 'と同様に、変数@pagesのように追加します。私は答えでそれを更新します。 – tworitdash