Display array element in rails - ruby-on-rails

I try to make the two columns list of products, this is my code
<table>
<% (0..#products.length-1).step(2) do |i| %>
<tr><td><div id="product_left">
<%= image_tag #products[i].photo.url(:small) %>
<%= #products[i].name %><br/>
Price: <%= #products[i].price %><br/>
<%= link_to "details", :action=>"show", :id=> #products[i].id %>
<%= link_to "add to card", {:controller=> "carts", :action=>"add", :id=> #products[i].id}, :remote=> true %>
</div> </td>
<% if #products.length > i %>
<td><div id="product_right">
<%= image_tag #products[i+1].photo.url(:small) %>
<%= #products[i+1].name %><br/>
Price: <%= #products[i+1].price %><br/>
<%= link_to "details", :action=>"show", :id=> #products[i+1].id %>
<%= link_to "add to card", {:controller=> "carts", :action=>"add", :id=> #products[i+1].id}, :remote=> true %>
</div></td>
<% end %>
</tr>
<% end %>
</table>
the problem is in the second div, rails give me an error on #products[i+1]. How can I solve it?

<table>
<% #products.each_slice(2) do |products| -%>
<tr>
<% products.zip(["left", "right"]).each do |product, side| -%>
<td>
<div id="product_<%= side %>">
<%= image_tag product.photo.url(:small) %>
<%= product.name %><br/>
Price: <%= product.price %><br/>
<%= link_to "details", product %>
<%= link_to "add to card", [:add, :carts, product], :remote=> true %>
</div>
</td>
<% end %>
</tr>
<% end -%>
</table>
Also you shouldn't use not uniq id. Here you have got multiple product_left and product_right ids. That's not good

Related

If condition in html.erb rails

How can I place an if condition in the HTML, in pseudocode, I'd like to achieve the following:
if #time.status is pending
place edit and delete below the message
else
not just display
end
This is my current code:
<% #value.each do |s| %>
<p><strong>Message:</strong>
<%= s.message %>
</p>
<p><strong>Date</strong>
<%= s.date %>
</p>
<p><strong>Status:</strong>
<%= s.status %>
</p>
<p>
<%= link_to 'Edit', value(), %>
<%= link_to 'Delete', value(), %>
</p>
If you have access to #time and status is an attribute of it, with a value that can be "pending" (thing you didn't add in the question), then you can do:
<% if #time.status == 'pending' %>
<!-- place edit and delete -->
<% else %>
<% #value.each do |s| %>
<p>
<strong>Message:</strong>
<%= s.message %>
</p>
<p>
<strong>Date</strong>
<%= s.date %>
</p>
<p>
<strong>Status:</strong>
<%= s.status %>
</p>
<p>
<%= link_to 'Edit', value(), %>
<%= link_to 'Delete', value(), %>
</p>
<% end %>
<% end %>
It is same as your iteration
<% if #time.status=="PENDING" %>
#your html code for edit in delete
<%end%>

Form_tag routing error after unsuccessful submit

I have an index page with a partial form to submit new records to Package model. I keep this form in the index page, so the user doesn't need to leave the page when repeating this action, several times.
In the same page I have a form_tag fir multiple updates for the same controller, namely packages_controller.
Everything works fine, except the following: when hit the update button, going to the form BUT instead of submitting I go back (with the browser) and try to select other records to be updated then I have a routing error:
Routing Error
No route matches [PUT] "/projects/47/orderlines/18/packages"
My index page looks like this:
<% if current_user %>
<%= render "packages/form" %>
<% end %>
<% if #packages.count >= 1 %>
<table class="table table-striped">
<thead>
<tr>
<th> <input type="checkbox" id="selectAll" value="selectAll"></th>
<th>Packed </th>
<th>#No.</th>
<th>Type</th>
<th>Gross weight</th>
<th>Length</th>
<th>Width</th>
<th>Height</th>
<th></th>
<th>Container</th>
</tr>
</thead>
<%= form_tag edit_multiple_project_orderline_packages_path, method: :get do %>
<tbody>
<% for package in #packages %>
<% if package.packed== true %>
<% #label_type="success" %>
<% else %>
<% #label_type="default" %>
<% end %>
<tr>
<td><%= check_box_tag "package_ids[]", package.id %></td>
<td><span class="label label-<%= #label_type %>"><% if package.packed==true %>Packed<% else %>Unpacked<% end %></span></td>
<td><%= package.package_no %></td>
<td><%= package.package_type %></td>
<td><%= package.gross_weight %></td>
<td><%= package.length %></td>
<td><%= package.width %></td>
<td><%= package.height %></td>
<% if #orderline.packages.count >= 1 %>
<td><%= link_to 'Delete', [package.orderline.project, package.orderline, package],
method: :delete,
data: { confirm: 'Are you sure?' } %></td>
<td><%= #containers.find(package.container_id).container_id if package.packed %></td>
<% end %>
</tr>
<% end %>
</tbody>
</table>
<%= submit_tag "Add to container", class: "btn btn-primary" %>
<% end %>
<br />
<%= will_paginate %>
<br>
And the multiple_edit form
<div class="col-sm-4">
<%= form_tag update_multiple_project_orderline_packages_path, method: :put do %>
<ul>
<% #packages.each do |package| %>
<li>
<%= hidden_field_tag "package_ids[]", package.id %>
<%= package.package_no %>
<%= package.container_id %>
<% package.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</li>
<% end %>
</ul>
<%= fields_for :package do |f| %>
<div class="field">
<%= f.label :package_no %><br />
<%= f.text_field :package_no, :class => "form-control" %>
</div>
<br />
<div class="field">
<%= f.label :container_id %><br />
<%= select_tag 'package[container_id]', options_from_collection_for_select(#project.containers, 'id', 'container_id', default_blank: true), prompt: "- Select container -", :class => "form-control" %>
</div>
<br />
<div class="field">
<%= f.label :packed %><br />
<%= f.select :packed, [["Packed", true], ["Unpacked", false]],{ prompt: "- Packing -"},{ :class => "form-control" } %>
</div>
<% end %>
<div class="actions">
<br />
<%= submit_tag "Update", :class => "btn btn-primary" %>
</div>
<% end %>
</div>
And the packages controller edit_multiple actions:
def edit_multiple
#project = Project.find(params[:project_id])
#packages = Package.find(params[:package_ids])
end
def update_multiple
#packages = Package.find(params[:package_ids])
#packages.reject! do |package|
package.update_attributes(package_params.reject { |k,v| v.blank? })
end
if #packages.empty?
redirect_to project_orderline_packages_url
else
#package = Package.new(package_params)
render "edit_multiple"
end
end
packages_controller create action:
def create
project = Project.find(params[:project_id])
orderline = project.orderlines.find(params[:orderline_id])
#package = orderline.packages.new(package_params)
#package.save
if #package.save
flash[:success] = "Package(s) was successfully added."
redirect_to :back
else
render 'new'
end
And my routes:
resources :projects do
resources :containers
resources :orderlines do
resources :packages do
collection do
put :packed
get :edit_multiple
put :update_multiple
end
end
end
end
I just added my routes here:
edit_multiple_project_orderline_packages_path GET /projects/:project_id/orderlines/:orderline_id/packages/edit_multiple(.:format)
packages#edit_multiple
update_multiple_project_orderline_packages_path PUT /projects/:project_id/orderlines/:orderline_id/packages/update_multiple(.:format)
packages#update_multiple
project_orderline_packages_path GET /projects/:project_id/orderlines/:orderline_id/packages(.:format)
packages#index
POST /projects/:project_id/orderlines/:orderline_id/packages(.:format)
packages#create
new_project_orderline_package_path GET /projects/:project_id/orderlines/:orderline_id/packages/new(.:format)
packages#new
edit_project_orderline_package_path GET /projects/:project_id/orderlines/:orderline_id/packages/:id/edit(.:format)
packages#edit
project_orderline_package_path GET /projects/:project_id/orderlines/:orderline_id/packages/:id(.:format)
packages#show
PATCH /projects/:project_id/orderlines/:orderline_id/packages/:id(.:format)
packages#update
PUT /projects/:project_id/orderlines/:orderline_id/packages/:id(.:format)
packages#update
DELETE /projects/:project_id/orderlines/:orderline_id/packages/:id(.:format)
your form_tag code is update_multiple_project_orderline_packages_path
I think it should be update_multiple_project_orderline_package_path(project_id, orderline_id, package_id)
I am not 100% sure with my statement above, because you gave scrambled Rails Routes, hard to read
and your form action seems goes to packages#edit_multiple controller
so paste your edit_multiple method, not create method
are you implementing your scenario above with javascript, or just plain HTML?

form not creating new entries

I am trying to create a form to add a transporter:
I have app/views/transporters/new.html.erb that calls a template,app/views/_form.html.erb that looks like:
<%= form_for(#transporter) do |f| %>
<% if #transporter.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(#transporter.errors.count, "error") %> prohibited this transporter from being saved:</h2>
<ul>
<% #transporter.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= f.label :name %><br>
<%= f.text_field :name %>
</div>
<div class="field">
<%= f.label :phone %><br>
<%= f.text_field :phone %>
</div>
<div class="field">
<%= f.label :id_number %><br>
<%= f.text_field :id_number %>
</div>
<div class="actions">
<%= f.submit 'Add transporter', class: 'btn btn-success' %>
</div>
<% end %>
<%= link_to 'Back to all transporters', transporters_path, class: "btn" %>
</div>
</div>
This is the create action in my transporters controller:
def create
#transporter = Transporter.new(transporter_params)
end
private
def transporter_params
params.require(:transporter).permit(:name, :phone, :id_number)
end
When I click Add transporter the form doesn't go anywhere. What do I have wrong?
Update:
this is my routes file:
Cowsnhills::Application.routes.draw do
resources :transporters
resources :deliveries
root 'welcome#index'
end
When I click submit the form reloads but the entries will not show on my transporters index, here is that code:
transporters controller method:
def index
#transporters = Transporter.all
end
and transporters index:
<h1>Listing transporters</h1>
<table>
<thead>
<tr>
<th>Name</th>
<th>Phone</th>
<th>Id</th>
<th></th>
<th></th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<% #transporters.each do |transporter| %>
<tr>
<td><%= transporter.name %></td>
<td><%= transporter.phone %></td>
<td><%= transporter.id %></td>
<td><%= f.link_to_add "Add a delivery", :deliveries %></td>
<td><%= link_to 'Show transporter details', transporter %></td>
<td><%= link_to 'Edit transporter details', edit_transporter_path(transporter) %></td>
<td><%= link_to 'Delete transporter', transporter, method: :delete, data: { confirm: 'Are you sure?' } %></td>
</tr>
<% end %>
</tbody>
</table>
<br>
<%= link_to 'New Transporter', new_transporter_path, class: "btn" %>
Also there's a transporter has_many deliveries and a velivery belongs_to transporter association going on
You just create a new object with your params from the form in your create action, but you don't save it.
add #transporter.save to your create action.
use
#transporter = Transporter.new(params[:transporter])
or
#transporter = Transporter.new(params["transporter"])
check my last comment to save it.

Using nested forms in Rails - How can I make the show page display every new entry in a table format depending on how many presents the user wants?

I have a baby present registry I'm building with Rails 3.2. There is a registry model and a present model nested under the registry model. Everything works 100% except in the show page.
When a user creates a registry he/she can add presents through the add presents tag (as many as he/she wants), but the problem is in the show page it only the first present is displayed as I want it too. The rest is displayed in plain non formatted text.
Any help please? I would like it to show in a table format.
Here is my code:
Here is the Registry Form:
<%= nested_form_for(#registry) do |f| %>
<% if #registry.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(#registry.errors.count, "error") %> prohibited this registry from
being saved:</h2>
<ul>
<% #registry.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<%= f.label :due_date %><br />
<%= f.date_select :due_date, :rows => 5 %>
<%= f.label :theme %><br />
<%= f.text_field :theme, :class => 'field2' %>
<div class="field1">
<%= f.label :gender %><br />
<%= f.text_field :gender %>
</div>
<div class="field1">
<%= f.fields_for :presents do |builder| %>
<%= render 'present_fields', f: builder %>
<% end %>
</div>
<%= link_to_add_fields "Add Presents", f, :presents %>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
The presents_fields:
<div class="field1">
<table>
<tr>
<td> <%= f.label :type, "Present Type" %> </td>
<td> <%= f.text_field :type, :class => 'field2' %> </td>
<td> <%= f.label :Quantity, "Quantity" %> </td>
<td> <%= f.number_field :quantity, :class => 'field3' %> </td>
<td> <%= f.label :color, "Color" %> </td>
<td> <%= f.text_field :color, :class => 'field2' %> </td>
<td> <%= f.label :brand, "Brand" %> </td>
<td> <%= f.text_field :brand, :class => 'field2' %> </td>
<td> <%= f.link_to_remove "Remove this present" %></td>
</tr>
</table>
</div>
The show page:
<% provide(:title, 'My Party and Present Whishes') %>
<%= notice %>
<p> Baby & Party Details: </p></br>
<li><p> Due date: </p> <%= #registry.due_date %></li></br>
<li><p> Party Theme: </p><%= #registry.theme %></li></br>
<li><p> Gender: </p><%= #registry.gender %></li></br>
<p> Presents Registry: </p></br>
<li>
<% #registry.presents.each do |registry| %>
<%= registry.type %>
<%= registry.quantity %>
<%= registry.color %>
<%= registry.brand %>
</li>
<% end %>
</br>
</br>
<%= link_to 'Edit', edit_registry_path(#registry) %>
<%= link_to 'Back', registries_path %>
<li>
<% #registry.presents.each do |registry| %>
Should not these lines be inverted?
<% #registry.presents.each do |registry| %>
<li>

SImple Rails Search

I generated a search_contoller and view for my rails app.
My Controller:
class SearchController < ApplicationController
def index
if params[:commit] == "Search"
# Great, now lets figure out what sort of query we're after
#searchQuery = params[:q]
#resultsReceived = true
if
#sqlResults = Product.where("title like ? OR categories like ?", "%" + params[:q] + "%", "%" + params[:q] + "%").order("published DESC")
end
else
#resultsReceived = false
#sqlResults = []
end
# Render the page when we're done.
respond_to do |format|
format.html
end
end
end
My View
<%= form_tag("/search", :method => "get") do %>
<%= label_tag(:q, "Search for:") %>
<%= text_field_tag(:q) %>
<%= submit_tag("Search") %>
<% end %>
<% if #resultsReceived == true %>
<b><%= #sqlResults.length %> Results Found For: </b><%= #searchQuery %>
<br>
<table>
<tr>
<th>Publish</th>
<th>Product</th>
<th></th>
</tr>
<% #sqlResults.each do |product| %>
<tr class="<%= cycle('oddrow', 'evenrow') %>">
<td><%= check_box_tag "product_ids[]", product.id, product.published, {:id => product.id, :class => "publish_checkbox"} %></td>
<td><%= link_to 'Edit', edit_product_path(product) %></td>
<td><%= link_to 'Destroy', product, confirm: 'Are you sure you want to KILL this product?', method: :delete %></td>
<td>
<div>
<b>Title:</b> <%= product.title %>
</div>
<div class="float_left prod_image">
<img src='<%= product.image_url %>' class='product_image'></img>
</div>
<div class="float_left prod_description">
<div><b>Product is Published: </b> <%= product.published %></div>
<div><b>Category Names:</b> <%= product.category_names %></div>
<div><b>Categories:</b> <%= product.categories %></div>
<div><b>Rating:</b> <%= product.rating %></div>
<div><b>Wow:</b> <%= product.is_curated %></div>
<div><b>Age:</b> <%= product.pr_attributes['ag_type'] %></div>
<div><b>Gender:</b> <%= product.pr_attributes['gender_type'] %></div>
<div>
<b>Description:</b>
<% if product.long_descr.length < 200 %>
<%= product.long_descr %>
<% else %>
<span id="short_desc_<%= product.id %>"><%= product.long_descr[0..199] %>...</span>
<span class="long_description", id="long_desc_<%= product.id %>"><%= product.long_descr %> </span><a id="<%= product.id %>" class="toggle">toggle</a>
<% end %>
</div>
<div><b>Backfill Male:</b> <%= product.backfill_text['male'] %></div>
<div><b>Backfill Female:</b> <%= product.backfill_text['female'] %></div>
<div><b>Backfill Unisex:</b> <%= product.backfill_text['unisex'] %></div>
<div><b>MP Seller Name:</b><%= product.mp_seller_name %></div>
<div><b>Price:</b> Current: $<%= product.curr_item_price %> / Base: $<%= product.base_item_price %></div>
<div><b>ID STR:</b> <%= product.id_str %></div>
<div><b>Stock:</b> <%= product.stock_status %></div>
<div><b>Last Updated by <%= product.updated_by_name %> at <%= product.updated_at %></b></div>
</div>
</tr>
<% end %>
<% end %>
I need the search to be more specific, and would like to break up the sql statement, so I can search for other additional attributes. For example, I would like search for either TITLE (and get results that match only the string entered by the user) or search by GENDER (and get back only the gender I user is searching for). How can I do this? Should I create new form_tags for each type of search I want to perform? Is it possible to have just one search box in the view, and have the user select between radio buttons as to what they want to search for?
With MySQL, your options are pretty limited to self constructing the LIKE clauses. Most Rails apps on MySQL will use other search options, like SOLr (sunspot), ElasticSearch, or Sphinx.
On PostgreSQL, you have many more options to use the built in full text search capabilities, like Texticle.
A lot of links to the above: https://www.ruby-toolbox.com/categories/rails_search

Resources