how to render view/index in another view/index? - ruby-on-rails

I dont understand how to insert code into my welcome/index.html.erb file. Here is my code:
Welcomes_controller.rb
def index
#welcomes = Welcome.all
end
Schedules_controller.rb
def index
#schedules = Schedule.all
end
schedules/index.html.erb
<table class="table table-hover">
<thead>
<tr>
<th>Время<br>отправления</th>
<th>Город</th>
<th>Место<br> отправления</th>
<th>Время <br>прибытия</th>
</tr>
</thead>
<tbody>
<% #schedules.each do |s| %>
<tr>
<td><%= s.deptime %></td>
<td><%= s.city %></td>
<td><%= s.street %></td>
<td><%= s.aparttime %></td>
</tr>
<% end %>
</tbody>
</table>
How do I insert that code into welcome/index.html.erb?

To render the schedules index template from the welcomes_controller.rb
def index
#welcomes = Welcome.all
render "/schedules/index"
end
However, this will present a problem because the table in the view depends on an #schedules instance variable to be set and it will return nil because it is not assigned a value in the controller.
you might want to do this:
def index
#schedules = Welcome.all
render "/schedules/index"
end
Which does not really make sense to me from a semantic point of view. You might want to rename the instance variable to something more model agnostic.
In the other answer it was suggested to use a partial. That could actually be a better solution depending on the use case.

create a partial app/views/shared/_index_table.html.erb with the content
<table class="table table-hover">
<thead>
<tr>
<th>Время<br>отправления</th>
<th>Город</th>
<th>Место<br> отправления</th>
<th>Время <br>прибытия</th>
</tr>
</thead>
<tbody>
<% schedules.each do |s| %>
<tr>
<td><%= s.deptime %></td>
<td><%= s.city %></td>
<td><%= s.street %></td>
<td><%= s.aparttime %></td>
</tr>
<% end %>
</tbody>
</table>
Then, app/views/schedules/index.html.erb
<h1>Schedules</h1>
<%= render partial: "shared/index_table", :locals => { schedules: #welcomes } %>
and app/views/welcomes/index.html.erb
<h1>Welcome</h1>
<%= render partial: "shared/index_table", :locals => { schedules: #schedules } %>
This works only if you have the same set of attributes (deptime, city, street, aparttime) on both Welcome and Schedule models

Related

Ransack showing all instead of filter

I am trying to use Ransack gem but it returns all 12,000 rows instead of using the filter.
Controller:
def list
#q = LmiHost.ransack(params[:q])
if !(params[:commit].nil?) then
#computers = #q.result
else
#computers = LmiHost.where(:job_id => 121)
end
end
View:
<script type="text/javascript">
$(document).ready(function() {
$("#computer_search_results").dataTable();
});
</script>
<table id="computer_search_table">
<%= search_form_for #q do |f| %>
<tr><td>Project:</td><td><%= f.select :job_id, #project_job_selector %></td></tr>
<tr><td><%= f.submit 'Search' %></td></tr>
<%end%>
</table>
<table id="computer_search_results">
<thead>
<tr>
<th>Lmi Name</th>
<th>Service Tag</th>
<th>Model</th>
<th>Ship Date</th>
<th>Warranty Date</th>
<th>Project</th>
<th>Invoice Name</th>
</tr>
</thead>
<tbody>
<% #computers.each do |computer| %>
<tr>
<td><%= computer.host_description %></td>
<td><%= computer.host_service_tag %></td>
<td><%= computer.host_model %></td>
<td><%= computer.ship_date %></td>
<td><%= computer.warranty_date %></td>
<td><%= computer.job.name unless computer.job.nil? %></td>
<td><%= computer.invoice_name %></td>
</tr>
<% end %>
</tbody>
</table>
the URL looks okay after seraching:
URL
But it is acting like :
#computers = LmiHost.all
Any ideas as too why this is happening?
What you are doing wrong is that you are not specifying a proper matcher. if you want to select particular job id you should indicate the search matcher in the form.
for example you are saying job_id where it should be job_id_eq or what ever matcher you want it to be
where you should getter a Ransack Search item like following.
Ransack::Search<class: LmiHost, base: Grouping <conditions: [Condition <attributes: ["job_id"], predicate: eq, values: ["123"]>], combinator: and>>
in your Ransack search I don't see the predicate hence it returns all the resutls.

rails update with checkbox

I want in my restaurant application to change the status of "preparated" to "deliverated" with a checkbox list but when doing the reload of the view where it does not make any changes, and logically the query is well I do not understand which is the problem.
View of the application
Orderdish.rb
class Orderdish < ApplicationRecord
belongs_to :order
belongs_to :dish
def self.orders_waiter waiter
orders_waiter=Orderdish.all.joins({:order => :table},:dish).select("orderdishes.*,orderdishes.state as status,orderdishes.id as id, dishes.*, dishes.speciality_id as speciality_id, tables.*, orders.*, orders.created_at as order_created, tables.*, tables.waiter_id as waiter_id").where("waiter_id = ?", waiter.id).where("orderdishes.state = ?", "preparated").order("order_created ASC")
return orders_waiter
end
end
Controller
def orderWaiter
#ordersWaiter = Orderdish.orders_waiter current_waiter
#ordersWaiter = #ordersWaiter.paginate(:page => 1, :per_page => 12)
end
def deliverated
puts Orderdish.where(id: params[:orderdishes_ids]).update_all state: "deliverated"
redirect_to :orderWaiter
end
Routes
resources :order_views do
collection do
put :preparated
put :deliverated
end
end
get 'orderWaiter' => 'order_views#orderWaiter'
View
<div class="aboutUs">
<%= form_tag deliverated_order_views_path, method: :put do %>
<table class="table table-inverse">
<thead>
<tr>
<th> </th>
<th>Created </th>
<th>Table </th>
<th>Name</th>
<th>Specification</th>
<th>Quantity</th>
<th>State</th>
<th colspan="3"></th>
</tr>
</thead>
<tbody>
<% #ordersWaiter.each do |orderwaiter| %>
<tr>
<td><%= check_box_tag "orderdishes_ids[]", orderwaiter.id %></td>
<td><%= orderwaiter.order_created.to_time.strftime('%B %e at %l:%M %p') %></td>
<td><%= orderwaiter.number %></td>
<td><%= orderwaiter.name %></td>
<td><%= orderwaiter.specification %></td>
<td><%= orderwaiter.quantity %></td>
<td><%= orderwaiter.status %></td>
</tr>
<% end %>
</tbody>
</table>
<%= submit_tag "Deliverated" %>
</div>
<% end %>

Ruby display array values

I am not a ruby developer. This is the first time I am looking into the code. I want to build a dynamic table for which I have managed below code. However, I am not able to display all the contents of the array except for the first and the last values. How do I display all the values?
Thanks for your help!!
<style>table, td, th{border:1px solid white;}td{padding:5px;}th{background-color:#E0E6EB;color:black;}</style>
<div>
<table border=2>
<tr>
<th width="250px"><B><p style="text-align: center">Name</p></B></th>
<th width="120px"><B><p style="text-align: center">Number</p></B></th>
<th width="60px"><B><p style="text-align: center">Status</p></B></th>
<th width="155px"><B><p style="text-align: center">Product Type</p></B></th>
<th width="60px"><B><p style="text-align: center">Source</p></B></th>
</tr>
<% tempTickets = #subject.PersonAccounts.sorted_by(field("title").in_descending_order) %>
<% cnt = tempTickets.length %>
<% tempTickets.each do |ticket| %>
<div>
<tr>
<td><%= ticket['perfinaccnt-accountname'].first %></td>
<td><%= ticket['perfinaccnt-accountnumber'].first %></td>
<td><%= ticket['perfinaccnt-accountstatus'].first %></td>
<td><%= ticket['perfinaccnt-producttype'].first %></td>
<td><%= ticket['perfinaccnt-accountsrcsystem'].first %></td>
</tr>
</div>
<div>
<tr>
<td><%= ticket['perfinaccnt-accountname'].last %></td>
<td><%= ticket['perfinaccnt-accountnumber'].last %></td>
<td><%= ticket['perfinaccnt-accountstatus'].last %></td>
<td><%= ticket['perfinaccnt-producttype'].last %></td>
<td><%= ticket['perfinaccnt-accountsrcsystem'].last %></td>
</tr>
</div>
<% end %>
</table>
</div>
You could do it with three nested loops:
<%= tempTickets.each do |ticket|
[
'perfinaccnt-accountname',
'perfinaccnt-accountnumber',
'perfinaccnt-accountstatus',
'perfinaccnt-producttype',
'perfinaccnt-accountsrcsystem'
].each do |f|
ticket[f].each do |tf|
puts "<td>tf</td>";
end if ticket[f]
end
end %>
I'm not sure about the data structure here but you could check it by doing an #inspect to tempTickets and all the subsequent objects. From the looks of it "ticket['perfinaccnt-accountname']" is actually an array
and as such you can just loop through it. Not the fastest way to do it but it should work to just do a nested loop.
<style>table, td, th{border:1px solid white;}td{padding:5px;}th{background-color:#E0E6EB;color:black;}</style>
<div>
<table border=2>
<tr>
<th width="250px"><B><p style="text-align: center">Name</p></B></th>
<th width="120px"><B><p style="text-align: center">Number</p></B></th>
<th width="60px"><B><p style="text-align: center">Status</p></B></th>
<th width="155px"><B><p style="text-align: center">Product Type</p></B></th>
<th width="60px"><B><p style="text-align: center">Source</p></B></th>
</tr>
<% tempTickets = #subject.PersonAccounts.sorted_by(field("title").in_descending_order) %>
<% cnt = tempTickets.length %>
<% tempTickets.each do |ticket| %>
<div><tr>
<% ticket.each do |k,v|
v.each do |col| %>
<td><%= col %></td>
<% end %>
<% end %>
</tr></div>
<% end %>
</table>
</div>

how do i display an index and a form on my show page?

How do I have my User's (users model) show page display a list of the Serivces (another model) they are offering AND also a form where people can book Appointments (another model) for their Services?
It looks like I need to make the #services variable more flexible in my controller. But I'm not sure how. It seems like only one partial I am rendering is able to make use of it in my controller. Weird!
USERS CONTROLLER
class UsersController < ApplicationController
def show
#user = User.find(params[:id])
#appointment = Appointment.new
#services = #user.services.collect {|service| [ service.id, service.title, service.description, service.length, service.user_id] }
end
end
USERS/SHOW.HTML.ERB:
LIST OF SERVICES PARTIAL: <% render 'shared/services_list' %>
<table>
<thead>
<tr>
<th>Start time</th>
<th>End time</th>
<th>Note</th>
<th>Service</th>
<th colspan="3"></th>
</tr>
</thead>
<tbody>
<% #appointments.each do |appointment| %>
<tr>
<td><%= appointment.start_time %></td>
<td><%= appointment.end_time %></td>
<td><%= appointment.note %></td>
<td><%= appointment.service.title %></td>
<td><%= link_to 'Show', appointment %></td>
<td><%= link_to 'Edit', edit_appointment_path(appointment) %></td>
<td><%= link_to 'Destroy', appointment, method: :delete, data: { confirm: 'Are you sure?' } %></td>
</tr>
<% end %>
</tbody>
</table>
USERS/SHOW.HTML.ERB:
APPOINTMENTS FORM PARTIAL: <%= render 'appointments/form' %>
<table>
<thead>
<tr>
<th>Title</th>
<th>Description</th>
<th>Length</th>
<th>User</th>
<th colspan="3"></th>
</tr>
</thead>
<tbody>
<% #services.each do |service| %>
<tr>
<td><%= service.title %></td>
<td><%= service.description %></td>
<td><%= service.length %></td>
<td><%= service.user.email %></td>
<td><%= link_to 'Show', service %></td>
<td><%= link_to 'Edit', edit_service_path(service) %></td>
<td><%= link_to 'Destroy', service, method: :delete, data: { confirm: 'Are you sure?' } %></td>
</tr>
<% end %>
</tbody>
</table>
ERROR:
NoMethodError in Users#show
undefined method `title' for [1, "exmaple title", "example description", 90, 1]:Array
Line 15 is highlighted -> <%= service.title %>
<tbody>
<% #services.each do |service| %>
<tr>
<td><%= service.title %></td>
<td><%= service.description %></td>
<td><%= service.length %></td>
<td><%= service.user.email %></td>
Thanks!
Okay. #peshkira was right. I neeeded to call the object.
So I added this line to my controller #services_list = #user.services.collect so I could create a list in the style of an 'index'.
My full controller looks like this.
class UsersController < ApplicationController
def show
#user = User.find(params[:id])
#appointment = Appointment.new
#services = #user.services.collect {|service| [ service.title, service.id] }
#services_list = #user.services.collect
end
end
That will supply functionality for a nested form(A Service & an Appointment for that Service) and also pull the data for a list of Services.

Rails create new records based on checked records

I have a table showing time entries (events) related to a workorder.
The user can enter a check on any of the table rows.
For each checked row, I want to create a new record in the invtime table.
invtime belongs_to :event
event has_many :invtimes
This is the table:
<table>
<thead>
<tr>
<th>Title</th>
<th>Employee</th>
<th>Date</th>
<th>Hours</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
<% Event.where("workorder_id = ?", Invoice.find(#invoice).workorder_id).where("billed = ?", false).each do |event| %>
<tr>
<td><%= check_box_tag(:add_record) %></td>
<td><%= event.title %></td>
<td><%= event.employee.employee_full_name %></td>
<td><%= event.starts_at.strftime("%m/%d/%Y") %></td>
<td><%= event.hours %></td>
<td></td>
</tr>
<% end %>
</tbody>
</table>
I'm not sure how to process the returned page with the checkboxes checked.
Should I use Javascript (coffeescript)? Or can I do it with Ruby?
This should do it:
<tbody>
<%= form_tag(your_path_helper) do %>
<% Event.where("workorder_id = ?", Invoice.find(#invoice).workorder_id).where("billed = ?", false).each do |event| %>
<tr>
<td><%= check_box_tag 'event_ids_to_save[]', value: event.id, checked: Invtime.exists?(event_id: event.id) %></td>
<td><%= event.title %></td>
<td><%= event.employee.employee_full_name %></td>
<td><%= event.starts_at.strftime("%m/%d/%Y") %></td>
<td><%= event.hours %></td>
<td></td>
</tr>
<% end %>
<tr><td colspan='6'><%= submit_tag %></td></tr>
<% end %>
</tbody>
The corresponding action of the controller responding to the form_tag submit:
def action_of_the_form_tag
params[:event_ids_to_save].each do |event_id|
event = Event.where(id: event_id)
# do your logic here
end
end

Resources