Pagination of data in Middleman - pagination

I have a very long list of titles in my data file data/works.yml which looks more or less like this:
---
-
id: 947
title: "First"
-
id: 955
title: "Second"
The list is too long too display without pagination. How can I paginate index.html, where I want this list to be displayed?

It turned out to be much easier than I thought. It was only a matter of adding gem 'middleman-pagination' in Gemfile, in config.rb:
activate :pagination do
pageable_set :works do
data.works
end
end
and in index.html.erb
---
pagination:
for: works
per_page: 20
---
<ol>
<% pagination.each do |w| %>
<li>
<%= w.title %>
</li>
<% end %>
<%= link_to "Next page", pagination.next_page.url if pagination.next_page %>
As explained here: https://github.com/Aupajo/middleman-pagination

Related

SyntaxError: Unexpected identifier when using ejs in nodejs

I am following The Net Nijna's tutorial on youtube.
I reached tutorial number 27, working with partials in ejs. Everything works until I add the <% include partials/nav.js %>, once I add this code I recieve:
SyntaxError: Unexpected identifier in (file location) testapp\views\profile.ejs while compiling ejs
If the above error is not helpful, you may want to try EJS-Lint:
https://github.com/RyanZim/EJS-Lint
Or, if you meant to create an async function, pass async: true as an option.
at new Function ()..... blah blah blah...
If I remove it, my ejs all works fine.
<body>
<% include partials/nav.ejs %>
<h1>Welcome to the profile of <%= person %> !</h1>
<p><strong> Age: <%= data.age %></strong></p>
<p><strong> Job: <%= data.job %></strong></p>
<p><strong> Pet: <%= data.pet %></strong></p>
<h2>Hobbies</h2>
<ul>
<% data.hobbies.forEach(function(item){ %>
<li><%= item %></li>
<%});%>
</ul>
</body>
can you help a student out? Thanks a ton!
Missing hyphen and need to invoke the include function.
<%- include('partials/nav') %>
I was stuck at the same problem and used -include('#filename');
it worked
Use: <%- include('folder/file') %>
agreeing with #Joseph Varilla
Not necessary to include engine extension as this should have been done in app.js or index.js file

fields_for not saving nested parameters in rails 5.0.1

I'm fairly new to rails, though I've made some basic apps and read several tutorials, this is the first time I've delved into nested attributes inside forms and the use of fields_for.
I've searched trough many similar questions and have read the documentation on fields_for, however my form doesn't seem to save whenever I use fields_for inside my form. I've tested without the fields_for and saves as it should (without saving to the nested DB, obviously).
What I'm trying to do is a simple Event registration, which in turn has some attributes and a date in a separate model.
I've tried with and without validations, many different things inside the strong parameters
Here is my Event models:
class Event < ApplicationRecord
has_many :eventdates, dependent: :destroy
accepts_nested_attributes_for :eventdates
validates :name, :description, :city, :street, :postal_code, presence: true
end
The Eventdate model:
class Eventdate < ApplicationRecord
belongs_to :event
validates :date, :start_hour, :finish_hour, :event_id, presence: true
end
The Event controller:
class EventsController < ApplicationController
def new
#event = Event.new
#event.eventdates.build
end
def create
#event = Event.new(event_params)
if #event.save
redirect_to root_url
else
render "static_pages/home"
end
end
private
def event_params
params.require(:event).permit(:name, :description, :street, :city, :postal_code, :address_number, :additional_info,
eventdates_attributes: [:id, :date, :start_hour, :finish_hour, :event_id])
end
And the form:
<%= form_for(#event, url: events_path) do |f| %>
<p>
<%= f.label :nombre %>
<%= f.text_field :name %>
</p>
<div>
<%= f.fields_for :eventdates do |eventdate_fields| %>
<%= eventdate_fields.label :fecha %>
<%= eventdate_fields.date_field :date %>
<%= eventdate_fields.label :hora_de_inicio %>
<%= eventdate_fields.time_field :start_hour %>
<%= eventdate_fields.label :hora_de_termino %>
<%= eventdate_fields.time_field :finish_hour %>
<% end %>
</div>
<p>
<%= f.label :infomaciĆ³n_adicional %>
<%= f.text_area :additional_info %>
</p>
<p>
<%= f.submit "Crear evento" %>
</p>
<% end %>
I'm pretty sure this is a very simple form, but somehow refuses to save at all into the database.
In eventdate.rb model, append optional: true to this line: belongs_to :event
class Eventdate < ApplicationRecord
belongs_to :event, optional: true
validates :date, :start_hour, :finish_hour, :event_id, presence: true
end
Because Rails will create eventdates first, then create event and links to those evendates (by updating all event_id in these evendates). But when creating eventdates, column event_id is nil and eventdates cannot be saved.

wrong number of arguments (0 for 1..2) Rails 4.2.0 and Ruby 2.2.2

I'm trying to embedded mail_form into my home page.
The 'contacts#new' is rendered on 'static_pages#home' so I instantiate #contact in StaticPagesController's home action to avoid the "First argument in form cannot contain nil or be empty" error.
But I now I get wrong number of arguments (0 for 1..2) errors instead.
I see this behaviour since I updated my ruby to 2.2.2.
Do you think this error is caused by new specification on Ruby, or it is just my simple code error?
static_pages_controller
class StaticPagesController < ApplicationController
def home
#contact = Contact.new
end
end
views/static_pages/home.html.erb
<section id="contact">
<%= render template: 'contacts/new' %>
</section>
contacts_controller
class ContactsController < ApplicationController
def new
#contact = Contact.new
end
def create
#contact = Contact.new(contact_params)
#contact.request = request
if #contact.deliver
flash.now[:notice] = "Thank you for your message. We will contact you soon!"
else
flash.now[:error] = "Cannot send message."
render 'new'
end
end
private
def contact_params
params.require(:contact).permit(:name, :email, :message)
end
end
views/contacts/new.html.erb
<%= form_for(#contact) do |f| %>
...
<% end %>
Logs
Processing by StaticPagesController#home as HTML
Rendered contacts/new.html.erb (23.5ms)
Rendered static_pages/home.html.erb within layouts/application (238.2ms)
Completed 500 Internal Server Error in 278ms
ArgumentError (wrong number of arguments (0 for 1..2)):
app/views/contacts/new.html.erb:28:in `block in_app_views_contacts_new_html_erb___4238619170782302276_70113984753480'
I update my version of 'byebug' to '4.0.1' and 'Web-console' to '2.1.2', then it shows where was the error. It was actually really stupid ...
Error:
<%= form_for(#contact) do |f| %>
<%= t.email_field ... %>
...
<% end %>
Correct:
<%= form_for(#contact) do |f| %>
<%= f.email_field ... %>
...
<% end %>

Searching Multiple Models with Ransack Rails 4

I'm trying to figure out how to search multiple models with Ransack. The goal is to have the search form in my shared header. I'm using a combination of their documentation, an old rails-cast, SO questions, and some code a friend shared with me. Right now I think it works, although I'm not sure because I can't get the results to show on my index page.
First, I created a search controller:
class SearchController < ApplicationController
def index
q = params[:q]
#items = Item.search(name_cont: q).result
#booths = Booth.search(name_cont: q).result
#users = User.search(name_cont: q).result
end
end
Next, I put this code in the header partial (views/layouts/_header.html.erb):
<%= form_tag search_path, method: :get do %>
<%= text_field_tag :q, nil %>
<% end %>
I added a route:
get "search" => "search#index"
My index.html.erb for the Search controller is empty and I suspect that is the problem, but I'm not sure what to place there. When I try something like:
<%= #items %>
<%= #users %>
<%= #booths %>
This is the output I get when I execute a search:
#<Item::ActiveRecord_Relation:0x007fee61a1ba10> #<User::ActiveRecord_Relation:0x007fee61a32d28> #<Booth::ActiveRecord_Relation:0x007fee61a20790>
Can someone please guide me on what the solution might be? I'm not sure if it's an index view problem, routing problem, or something else. On all of the tutorials the search field and results are only for one model so I'm a little confused on how to pull this off across multiple models.
Thanks!
The output you are getting is correct. Each of those variables contains an ActiveRecord_Relation object which can be treated like an array. Normally you'd do something like:
<% #items.each do |item| %>
<%= item.name %> # or whatever
<% end %>
<% #users.each do |user| %>
# and so on
Alternatively, you could combine your results #results = #items + #booths + #users and then:
<% #results.each do |result| %>
# display the result
<% end %>

expected, got String HABTM

This form:
<%= form_tag({:controller => "smart_lists", :action => "create"}, class: 'form-inline', :method => "POST") do %>
<%= label_tag :name %>
<%= text_field_tag :name %><br><br>
<% #people.each do |person| %>
<%= check_box_tag 'people_id[]', id: person.id %><%= label_tag person.name %><br>
<% end %>
<%= submit_tag "Create", class: 'btn' %>
Sends its check box list to a controller here:
def create
#smart_list = SmartList.new(params[:smart_list])
#smart_list.name = params[:name]
#smart_list.people = params[:people_id]
etc....
And I end up with this in my logs:
"name"=>"This is not working : (", "people_id"=>["{:id=>64}", "{:id=>8}", "{:id=>1}"]
And this in my view:
Person(#70133507313700) expected, got String(#70133469090180)
So, I guess my question is - Is there a way to break the that stuff out of those strings? Or can I send them through the form in a better way? Or catch them a better way in the controller?
Thanks for your help - Joey
I ended up changing the check_box_tag in the form to:
<td><%= check_box_tag 'people[]', person.id %></td>
Which gave me something like this in my params:
"people"=>["67", "11", "10", "23", "3", "1"],
And then in the controller I looped through the :people params and took out the ids:
if params[:people]
params[:people].each do |p|
#smart_list.people << Person.where(id: p)
end
end
I feel like this is pretty ugly - but it works. If anyone has a better way to form the view or controller I would still like to know a better way to do this. - Thanks

Resources