Question

I'm missing something about visibility of variables. In my config.rb i'm using a data structure to generate dynamic pages:

    @pages = [
    {
      id: "cookies",
      title: "Happy Chocolate Chip Cookies", 
      quote: "These cute cookies are full of sweet chocolate and ready to give you energy!",
      content: "Orecchini a monachella. Realizzati in fimo, dipinti a mano e rivestiti con vernice lucida."
    },
    ....]



 @pages.each do |p|
    page "/creations/#{p[:id]}.html", :proxy => "item-template.html", :ignore => true do 
      @tile = p
    end
  end

The pages generation goes well, no problem with that. But..

How can i access this data structure also in order to provide dynamic links to the generated pages? I would like to be able to create an index page (let's call it creations.html) with the following code:

    <ul>
    <% @pages.each do |tile| %>
        <li><a href="creations/<%= tile[:id]%>.html">
            <%= tile[:title] %>
        </a></li>
    <% end %>
</ul>
Was it helpful?

Solution

No need to create a custom helper, you can use a yaml data file to populate your template and generate the list of links. Let me explain.

On the same level as source and build directories make sure you create a data directory. ie:

  • build
  • source
  • data

Inside this create a file called "pages.yml" (for example).

This file needs to be specifically formatted so be careful (or use a yaml parser to make sure you don't have any errors - like a missing comma or escaped quote).

Using the data in your config.rb file, an example would be something like:

- id: "cookies"
  title: "Happy Chocolate Chip Cookies"
  quote: "These cute cookies are full of sweet chocolate and ready to give you energy!"
  content: "Orecchini a monachella. Realizzati in fimo, dipinti a mano e rivestiti con vernice lucida."

 - id: "bacon"
   title: "Smoked bacon bits"
   quote: "everything tastes better with bacon!"
   content: "blah"

etc...

Now, in your config.rb file replace @pages.each do |p| with data.pages.each do |p|

data.pages.each loops through each item in the newly created yaml file

You can then simply reference the same file in your index file (creations.html) like so:

<ul>
  <% data.pages.each do |tile| %>
    <li><a href="creations/<%= tile[:id]%>.html">
       <%= tile[:title] %>
    </a></li>
  <% end %>
</ul>

I had a similar problem around dynamic pages which you can refer to here

Hope this helps. Good luck!

OTHER TIPS

Perhaps add a helper that returns the @pages data structure in your file creations.erb. I.e. in your config.rb file add:

helpers do
  def dynamic_pages()
    @pages
  end
end

and then in your creations.erb have:

<ul>
  <% dynamic_pages.each do |tile| %>
    <li><a href="creations/<%= tile[:id]%>.html">
       <%= tile[:title] %>
    </a></li>
  <% end %>
</ul>

And, if you want to reference dynamic pages in your dynamic pages(!), a helper could generate that html and you could call the ... nah, never mind!

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top