I have controller looks like :
## controllers/lhgs_controller.rb
def index
#per_page = params[:per_page] || 10
#totalsolds = Totalsold.paginate(:per_page => #per_page, :page => params[:page]).order('date asc').group_by{ |s| [s.date, s.store_id, s.nomor] }
end
And views :
## index.hmtl.erb
<div id="totalsolds"><%= render 'totalsolds' %></div>
## views/_totalsolds.html.erb
<% #totalsolds.each do |(date, store, nomor), totalsold| %>
<tr>
<td><%= date.strftime("%d/%m/%Y") %></td>
<td><%= nomor %></td>
<td><%= Store.find(store).name %></td>
<% totalsold.each do |ts| %>
<td><%= ts.qty == 0 || ts.qty == nil ? "-" :prod.qty %></td>
<% end %>
<td>Rp<%= number_to_currency(totalsold.sum(&:value), :unit => "") %></td>
<td><%= link_to "edit", edit_bt_path(:store_id => store, :date => date, :nomor => nomor), :class => "btn btn-primer" %></td>
</tr>
<% end %>
...
...
<div class="row">
<div class="col-sm-6">
<% line 65 %>
<%= page_entries_info #totalsolds %>
</div>
<div class="col-sm-6">
<%= will_paginate #totalsolds, :style => 'float:right;margin-top:-5px;height:30px;' %>
</div>
</div>
I got an error :
ArgumentError in Lhgs#index
Showing C:/Sites/cms/app/views/lhgs/_totalsolds.html.erb where line
65 raised:
The #lhgs variable appears to be empty. Did you forget to pass the
collection object for will_paginate?
I found same question and solution, but I can't figure out how to use it for my case.
UPDATE :
I'm not found anywhere #lhgs variable, I tried to change #totalsolds to #lhgs and now my controller lookslike :
## controllers/lhgs_controller.rb
def index
#per_page = params[:per_page] || 10
#lhgs = Totalsold.order('date asc').group_by{ |s| [s.date, s.store_id, s.nomor] }
#lhgs = #lhgs.paginate(:per_page => #per_page, :page => params[:page])
end
And this an error :
NoMethodError in LhgsController#index
undefined method `paginate' for #<Hash:0x4c034a0>
Use rails console :
irb(main):001:0> #lhgs = Totalsold.order('date asc').group_by{ |s| [s.date, s.store_id, s.nomor] }
.... look at pastebin ......
irb(main):002:0> #lhgs.class
=> Hash
pastebin
Solved
reference
On controller :
def index
#per_page = params[:per_page] || 10
#lhgs = Totalsold.order('date asc').group_by{ |s| [s.date, s.store_id, s.nomor] }
#lhgs_keys = #lhgs.paginate(:per_page => #per_page, :page => params[:page])
end
And on view :
<% #lhgs_keys.each do |k| %>
<% #lhgs[k].group_by{ |s| [s.date, s.store_id, s.nomor] }.each |(date, store, nomor), totalsold| %>
.....
....
<% end %>
<% end %>
<div class="row">
<div class="col-sm-6">
<% line 65 %>
<%= page_entries_info #lhgs_keys %>
</div>
<div class="col-sm-6">
<%= will_paginate #lhgs_keys, :style => 'float:right;margin-top:-5px;height:30px;' %>
</div>
</div>
Try it like this:
# controllers/lhgs_controller.rb
def index
#per_page = params[:per_page] || 10
#totalsolds = Totalsold.paginate(:per_page => #per_page, :page => params[:page]).order('date asc').group_by{ |s| [s.date, s.store_id, s.nomor] }
respond_to do |format|
format.html
end
end
And the index.html can be like this:
<% #totalsolds.each do |(date, store, nomor), totalsold| %>
<tr>
<td><%= date.strftime("%d/%m/%Y") %></td>
<td><%= nomor %></td>
<td><%= Store.find(store).name %></td>
<% totalsold.each do |ts| %>
<td><%= ts.qty == 0 || ts.qty == nil ? "-" :prod.qty %></td>
<% end %>
<td>Rp<%= number_to_currency(totalsold.sum(&:value), :unit => "") %></td>
<td><%= link_to "edit", edit_bt_path(:store_id => store, :date => date, :nomor => nomor), :class => "btn btn-primer" %></td>
</tr>
<% end %>
...
<div class="row">
<div class="col-sm-6">
<% line 65 %>
<%= page_entries_info #totalsolds %>
</div>
<div class="col-sm-6">
<%= will_paginate #totalsolds, :style => 'float:right;margin-top:-5px;height:30px;' %>
</div>
</div>
Related
There is something wrong with my code, and I couldn't figure out what is it. It's already one day I'm trying to solve this by googling and searching on Stack Overflow.
Errors:
Processing ClassTimingsController#show (for 127.0.0.1 at 2014-02-05 15:27:19) [POST]
Parameters: {"authenticity_token"=>"sRTUkx7slXEX+kmzNl4GbYSIFSyf1WGSP5fRB5+rPzY=",
"batch_id"=>"13", "_"=>"", "action"=>"show", "controller"=>"class_timings"}
[FedenaRescue] AR-Record_Not_Found Couldn't find Planner without an ID
ActiveRecord::RecordNotFound (Couldn't find Planner without an ID):
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/base.rb:1567:in `
find_from_ids'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/base.rb:616:in `find'
app/controllers/class_timings_controller.rb:103:in `show'
I guess there is some problem with the "class_timings_controller.rb" in show.
def show
#planner = nil
if params[:planner_id] == ''
#class_timings = ClassTiming.find(:all, :conditions=>["planner_id is null and is_deleted = false"])
else
#class_timings = ClassTiming.active_for_planner(params[:planner_id])
#planner = Planner.find params[:planner_id] unless params[:id] == ''
end
respond_to do |format|
format.js { render :action => 'show' }
end
end
What is my mistake?
Below is the code for MVC.
Model (class_timing.rb)
class ClassTiming < ActiveRecord::Base
belongs_to :batch
belongs_to :planner
validates_presence_of :subject_title
validates_uniqueness_of :subject_title, :scope => [:planner_id , :batch_id, :is_deleted]
named_scope :for_batch, lambda { |b| { :conditions => { :batch_id => b.to_i, :is_deleted=>false, :checklist => false} } }
named_scope :default, :conditions => { :batch_id => nil, :checklist => false, :is_deleted=>false }
named_scope :active_for_batch, lambda { |b| { :conditions => { :batch_id => b.to_i, :is_deleted=>false} } }
named_scope :active, :conditions => { :batch_id => nil, :is_deleted=>false }
named_scope :for_planner, lambda { |p| { :conditons => { :planner_id => p.to_i, :is_deleted=>false, :checklist => false} } }
named_scope :default, :conditions => { :planner_id => nil, :checklist => false, :is_deleted=>false }
named_scope :active_for_planner, lambda { |p| { :conditions => { :planner_id => p.to_i, :is_deleted=>false} } }
named_scope :active, :conditions => { :planner_id => nil, :is_deleted=>false }
end
View
index
<div id="content-header">
<%= image_tag("/images/show_timetable.png") %>
<h1><%= t('teaching_schedule') %></h1>
<h3><%= t('create_new_teaching_schedule') %></h3>
<div id="app-back-button">
<%= link_to_function image_tag("/images/buttons/back.png", :border => 0), "history.back()" %>
</div>
</div>
<div id="page-yield">
<div id="flash_box"></div>
<% unless flash[:notice].nil? %>
<p class="flash-msg"> <%= flash[:notice] %> </p>
<% end %>
<div class="label-field-pair">
<label ><%= t('select_a_batch') %>:</label>
<div class="text-input-bg">
<%= select :batch, :id,
#batches.map {|b| [b.full_name, b.id] },
{:prompt => "#{t('common')}"},
{:onchange => "#{remote_function(
:url => { :action => 'show' },
:with => "'batch_id='+value",
:before => "Element.show('loader')",
:success => "Element.hide('loader')"
)}"} %>
<label ><%= t('select_a_module') %>:</label>
<div class="text-input-bg">
<%= select :planner, :id,
#planners.map {|p| [p.name, p.id] },
{:prompt => "#{t('common')}"},
{:onchange => "#{remote_function(
:url => { :action => 'show' },
:with => "'planner_id='+value",
:before => "Element.show('loader')",
:success => "Element.hide('loader')"
)}"} %>
<%= image_tag("loader.gif", :align => "absmiddle", :border => 0, :id => "loader", :style =>"display: none;" ) %>
</div></div></div>
<div id="class-timings-list"><%= render :partial => "show_batch_timing" %></div>
<div id="modal-box" style="display:none;"></div>
<div class="extender"></div>
</div>
show
<div class="linker">
<%= link_to_remote "#{t('add')}", :url => { :action => 'new', :id => #planner , :id => #batch} %>
</div>
<% unless #class_timings.empty? %>
<table id="class-timings-list" width="100%">
<tr class="tr-head">
<td><%= t('subject_title') %></td>
<td><%= t('page_no') %></td>
<td><%= t('duration') %></td>
<td><%= t('checklist') %></td>
<td><%= t('tutor_name') %></td>
<td><%= t('operations') %></td>
</tr>
<% #class_timings.each do |class_timing| %>
<tr id="class-timing-<%= class_timing.id %>" class="tr-<%= cycle('odd','even') %>">
<td class="col-2"><%= class_timing.subject_title %></td>
<td class="col-5" style="text-align:right"><%= class_timing.page_no %></td>
<td class="col-5" style="text-align:right"><%= class_timing.duration %></td>
<td class="col-5" style="text-align:center"><%= check_box_tag(nil, class_timing.checklist, class_timing.checklist, :disabled => true) %></td>
<td class="col-3"><%= class_timing.tutor_name %></td>
<td class="col-3"><small><%= link_to_remote("#{t('edit_text')}",
:url => edit_class_timing_path(class_timing), :method => 'get' ) %> |
<% #tt = PeriodEntry.find_all_by_id(class_timing_id ) %>
<!-- <% #tt = PeriodEntry.find_all_by_class_timing_id(class_timing.id ) %> -->
<% if #tt.empty? %>
<%= link_to_remote("#{t('delete_text')}",
:url => class_timing_path(class_timing),
:method => 'delete',
:confirm => "#{t('confirm_msg')}",
:update => "class-timing-#{class_timing.id}") %>
<% else %>
<s><%= t('delete_text') %></s>
<% end %></small></td>
</tr>
<% end %>
</table>
<% else %>
<h4><%= t('set_in_common') %></h4>
<% end %>
new
<label class="head_label"><%= t('create_new_teaching_schedule_for') %> <br>
<span>
<% if #planner.nil? and #batch.nil? %>
<%= t('common') %>
<% else %>
<%= #planner.name and #batch.full_name %>
<% end %>
</span></label>
<div id="ajax-create">
<% form_remote_for :class_timing,
:url => { :action => 'create'} do |f| %>
<% planner_id = (#planner.nil? ? nil : #planner.id) %>
<% batch_id = (#batch.nil? ? nil : #batch.id) %>
<%= f.hidden_field :planner_id, :value => planner_id %>
<%= f.hidden_field :batch_id, :value => batch_id %>
<div id="form-errors"></div>
<div class="label-field-pair">
<label for="name"><%= t('subject_title') %></label>
<div class="input-field"><%= f.text_field :subject_title %></div>
</div>
<div class="label-field-pair">
<label for="name"><%= t('page_no') %></label>
<div class="input-field"><%= f.text_field :page_no %></div>
</div>
<div class="label-field-pair">
<label for="name"><%= t('duration') %></label>
<div class="input-field"><%= f.text_field :duration %></div>
</div>
<div class="label-field-pair">
<label for="name"><%= t('Completed') %></label>
<div><%= f.check_box :checklist, :checked => false %></div>
</div>
<div class="label-field-pair">
<label for="name"><%= t('tutor_name') %></label>
<div class="input-field"><%= f.text_field :tutor_name %></div>
</div>
<br>
<br>
<br>
<%= f.submit "? #{t('save')}", :class => 'submit-button' %>
<% end %>
</div>
edit
<label class="head_label"><%= t('edit_teaching_schedule_for') %> <br>
<span>
<% if #planner.nil? and #batch.nil? %>
<%= t('common') %>
<% else %>
<%= #planner.name and #batch.name %>
<% end %>
</span></label>
<div id="ajax-edit">
<% form_remote_for #class_timing do |f| %>
<div id="form-errors"></div>
<div class="label-field-pair">
<label for="name"><%= t('subject_title') %></label>
<div class="text-input-bg"><%= f.text_field :subject_title %></div>
</div>
<div class="label-field-pair">
<label for="name"><%= t('page_no') %></label>
<div class="text-input-bg"><%= f.text_field :page_no %></div>
</div>
<div class="label-field-pair">
<label for="name"><%= t('duration') %></label>
<div class="text-input-bg"><%= f.text_field :duration %></div>
</div>
<div class="label-field-pair">
<% if #class_timing.checklist %>
<label for="name"><%= t('Completed') %></label>
<div><%= f.check_box :checklist, :checked => true %></div>
<% else %>
<label for="name"><%= t('Completed') %></label>
<div><%= f.check_box :checklist, :checked => false %></div>
<% end %>
</div>
<div class="label-field-pair">
<label for="name"><%= t('tutor_name') %></label>
<div class="input-field"><%= f.text_field :tutor_name %></div>
</div>
<br>
<br>
<br>
<%= submit_tag "? #{t('save')}", :class => 'submit-button' %>
<% end %>
</div>
Controller (class_timings_controller.rb)
class ClassTimingsController < ApplicationController
before_filter :login_required
filter_access_to :all
def index
#batches = Batch.active
#planners = Planner.active
#class_timings = ClassTiming.find(:all,:conditions => { :planner_id => nil, :batch_id => nil, :is_deleted=>false})
end
def new
#class_timing = ClassTiming.new
#batch = Batch.find params[:id] if request.xhr? and params[:id]
#planner = Planner.find params[:id] if request.xhr? and params[:id]
respond_to do |format|
format.js { render :action => 'new' }
end
end
def create
#class_timing = ClassTiming.new(params[:class_timing])
#planner = #class_timing.planner
#batch = #class_timing.batch
respond_to do |format|
if #class_timing.save
#class_timing.planner.nil? and #class_timing.batch.nil? ?
#class_timings = ClassTiming.find(:all,:conditions => { :planner_id => nil,:batch_id => nil,:is_deleted=>false}) :
#class_timings = ClassTiming.for_batch(#class_timing.batch_id)
#class_timings = ClassTiming.for_planner(#class_timing.planner_id)
# flash[:notice] = 'Teaching schedule was successfully created.'
format.html { redirect_to class_timing_url(#class_timing) }
format.js { render :action => 'create' }
else
#error = true
format.html { render :action => "new" }
format.js { render :action => 'create' }
end
end
end
def edit
#class_timing = ClassTiming.find(params[:id])
respond_to do |format|
format.html { }
format.js { render :action => 'edit' }
end
end
def update
#class_timing = ClassTiming.find params[:id]
respond_to do |format|
if #class_timing.update_attributes(params[:class_timing])
#class_timing.planner.nil? and #class_timing.batch.nil? ?
#class_timings = ClassTiming.find(:all,:conditions => { :planner_id => nil, :batch_id => nil}) :
#class_timings = ClassTiming.for_batch(#class_timing.batch_id)
#class_timings = ClassTiming.for_planner(#class_timing.planner_id)
# flash[:notice] = 'Teaching schedule updated successfully.'
format.html { redirect_to class_timing_url(#class_timing) }
format.js { render :action => 'update' }
else
#error = true
format.html { render :action => "new" }
format.js { render :action => 'create' }
end
end
end
def show
#batch = nil
if params[:batch_id] == ''
#class_timings = ClassTiming.find(:all, :conditions=>["batch_id is null and is_deleted = false"])
else
#class_timings = ClassTiming.active_for_batch(params[:batch_id])
#batch = Batch.find_by_id params[:batch_id] unless params[:batch_id] == ''
end
#planner = nil
if params[:planner_id] == ''
#class_timings = ClassTiming.find(:all, :conditions=>["planner_id is null and is_deleted = false"])
else
#class_timings = ClassTiming.active_for_planner(params[:planner_id])
#planner = Planner.find_by_id params[:planner_id] unless params[:planner_id] == ''
end
respond_to do |format|
format.js { render :action => 'show' }
end
end
def destroy
#class_timing = ClassTiming.find params[:id]
#class_timing.update_attribute(:is_deleted,true)
end
end
I provide all the code to help you figure out better, although I knew some of the code is irrelevant to show.
params[:planner_id] or params[:id]
is not passed properly I guess..
Use Planner.find_by_id params[:planner_id]
You're not passing params[:planner_id] into your controller, therefore it is nil, not ''.
So the else on your conditional is being invoked, and you're calling Planner.find nil.
Change this by calling if params[:planner_id].present? instead.
Try this out:
#planner = Planner.find params[:planner_id] if params[:id].present?
present? will take care of nil, blank, etc.
Now, I tried to set up the route with group_path(#group) but got an error message like,
ActiveRecord::RecordNotFound at /groups/%23%3CActiveRecord::Relation:0x007fd6cf362538%3E
Couldn't find Group with id=#<ActiveRecord::Relation:0x00fds6cf362538>
Here is my code. I would like to set up a link to groups/show/:id. Why did this error occur? Could you give me how to solve this?
☆index.html.erb
<% if #items.present? %>
<% #items.each do |i| %>
<% i_attr = i.get_element('ItemAttributes') %>
<tr>
<td> <%= link_to image_tag(i.get('SmallImage/URL'), {:style => 'border: none;'}), i_attr.get('DetailPageURL') %></td>
<td> <%= link_to i_attr.get('Title'), i_attr.get('DetailPageURL') %></td>
<td> <%= i_attr.get('Author') %></td>
<td> <%= i_attr.get('PublicationDate')%></td>
<td> <%= i_attr.get('Publisher') %></td>
<td> <%= i_attr.get('NumberOfPages')%></td>
<td>
<% if #existing_groups_isbns.include? i_attr.get('ISBN') %>
<% #existing_groups_isbns.each do |isbn| %>
<% if isbn == i_attr.get('ISBN') %>
<% #group = Group.where(:isbn =>isbn) %>
<%= link_to '既存ページへ' , group_path(#group) %>
<% end %>
<% end %>
<% else %><!-- if includes?==-->
<%= link_to '新規作成', {:controller => 'groups', :action => 'new', :name => i.get('ItemAttributes/Title'),:author => i.get('ItemAttributes/Author'), :publish => i.get('ItemAttributes/Publisher'), :published => i.get('ItemAttributes/PublicationDate'), :isbn => i.get('ItemAttributes/ISBN'), :page => i.get('ItemAttributes/NumberOfPages'), :imageurl=>i.get('MediumImage/URL')} ,class: "btn btn-midium btn-primary"%>
<% end %><!--if includes?-->
</td>
</tr>
<% end %><!-- #items.each do-->
<% else %><!--if #items.present?-->
見つかりませんでした。
<% end %><!-- if #items.present?-->
☆index_controller
def index
#keyword = params[:keyword]
if #keyword.present?
Amazon::Ecs.debug = true
res = Amazon::Ecs.item_search(params[:keyword],
:search_index => 'All', :response_group => 'Medium')
#items = res.items
search_isbns = #items.map{ |isbns| isbns.get('ItemAttributes/ISBN')}
search_asins = #items.map{ |asins| asins.get('ItemAttributes/ASIN')}
#existing_groups_isbns = Group.select(:isbn).where(:isbn => search_isbns).map(&:isbn)
#existing_groups_ids = Group.where(:isbn => search_isbns).map{|g| g.id}
end
Replace
<% #group = Group.where(:isbn =>isbn) %>
with
<% #group = Group.where(:isbn =>isbn).first %>
Because you need an object where you had an ActiveRecord relation
Now I am trying to set up switching button to follow someone.
<div class="onoff">
<% unless session[:user_id] == member.id %>
<% if #isFr.friend_id == member.id %>
<%= link_to'off', {:controller => 'members', :action => 'index', :id =>
member.id}, class: "btn btn-midium btn-primary"%><br/>
※following
<% else %>
<%= link_to'on', {:controller => 'members', :action => 'index', :id =>
member.id}, class: "btn btn-midium btn-primary"%><br/>
※not following
<% end %>
<% end %>
</div-->
But I got an error message.
undefined method `friend_id' for #<ActiveRecord::Relation:0x007fc4b54935f0>
and looked into #isFr and it has
>> #isFr
=> [#<Friend id: 196, member_id: 2, friend_id: 3, created_at: "2013-12-23 01:28:18", updated_at: "2013-12-23 01:28:18">]
So, I can't extract friend_id value from #isFr.
How can I solve this?
☆members_controller
def index
if !checklogin? then return end
#members = Member.where("id >=1").order("created_at desc").paginate(:page => params[:page], :per_page => 10).scoped
if Friend.where(:member_id => session[:user_id], :friend_id => params[:id]).exists? then
Friend.where(:member_id => session[:user_id], :friend_id => params[:id]).each do |f|
f.destroy
end
else
Friend.new({:member_id => session[:user_id], :friend_id =>params[:id].to_i}).save
end
#isFr =Friend.where(:member_id => session[:user_id], :friend_id => #members.map(&:id)).limit(1)
respond_to do |format|
format.html # index.html.erb
format.json
end
end
☆index.html.erb(members#index)
<table class="table">
<tr>
<th>写真</th>
<th>名前</th>
<th>分野</th>
<th>場所</th>
<th>経験</th>
<th></th>
<%# if Member.find(session[:user_id]).admin %>
<%# end %>
</tr>
<% #members.each do |member| %>
<tr>
<td>
<% if member.provider %>
<%=image_tag member.image ,:size=>'30x30'%>
<% elsif member.avatar_file_name %>
<%= image_tag member.avatar.url(:thumb), :width =>'30px', :height =>'30px' %>
<% else %>
<%= image_tag "love.png", :size=>'30x30' %>
<% end %>
</td>
<td>
<%= member.name %>
<% if member.provider == "facebook" %>
<a target="_blank" href="http://www.facebook.com/<%=member.uid %>"> <%=image_tag "fb.png" ,:size=>'20x20'%> </a>
<% elsif member.provider == "twitter" %>
<a target="_blank" href="http://www.twitter.com/<%=member.name %>"> <%=image_tag "twitter.png" ,:size=>'20x20'%> </a>
<% end %>
</td>
<td><%= member.field %></td>
<td>
<% if member.url.present? %>
<%=link_to member.place ,member.url ,:target=>["_blank"] %>
<% else %>
<%= member.place %>
<% end %>
</td>
<td><%= member.experience %></td>
<td>
<div class="onoff">
<% unless session[:user_id] == member.id %>
<% if #isFr.friend_id == member.id %>
<%= link_to'off', {:controller => 'members', :action => 'index', :id =>
member.id}, class: "btn btn-midium btn-primary"%><br/>
※following
<% else %>
<%= link_to'on', {:controller => 'members', :action => 'index', :id =>
member.id}, class: "btn btn-midium btn-primary"%><br/>
※not following
<% end %>
<% end %>
</div-->
<%#= member.friends.count %>
</td>
<% if Member.find(session[:user_id]).admin %>
<td><%= link_to 'Destroy', member, method: :delete, data: { confirm: 'Are you sure?' } %></td>
<% end %>
</tr>
<% end %>
</table>
The problem is at this line
#isFr =Friend.where(:member_id => session[:user_id], :friend_id => #members.map(&:id)).limit(1)
That will respond a ActiveRecord::Relation but you need a Friend object. Try this
#isFr =Friend.where(:member_id => session[:user_id], :friend_id => #members.map(&:id)).first
I'm fairly new to Ruby on Rails, making a directory type of website as a personal project to learn.
In my app, I implemented Geocoder search so the user can search for places/locations near them, the search worked perfect. But then when I added tabbed menus to categorize what type of places are available it broke the search.
I think I know why it's broken but not sure how to fix it. The tabs are showing the #schools, #restaurants, and #businesses variables, how can I get the tabs to show the search results and not those variables? Those variables should only show up when there is no search executed, but they also show up when the search is executed.
Here's my code:
Places Controller:
class PlacesController < ApplicationController
before_filter :authenticate_user!, except: [:index]
def index
if params[:search].present?
#places = Place.near(params[:search], 50, :order => :distance)
else
#places = Place.all
end
#schools = Place.where("category = ?", "School")
#restaurants = Place.where("category = ?", "Restaurant")
#businesses = Place.where("category = ?", "Business")
end
Places Index.html.erb:
<% if user_signed_in? %>
<div class="row">
<h2>Newly Added Places</h2>
<%= form_tag places_path, :method => :get do %>
<%= text_field_tag :search, params[:search], placeholder: "Enter your zipcode or city", class: "search-query" %>
<%= submit_tag "Search Nearby", :name => nil, class: "btn"%>
<% end %>
<ul class="nav nav-tabs">
<li>Schools</li>
<li>Restaurants</li>
<li>Businesses</li>
</ul>
<div class="tab-content">
<div class="tab-pane active" id="tab1">
<%= render :partial => "places", :locals => {:places_container => #schools} %>
</div>
<div class="tab-pane" id="tab2">
<%= render :partial => "places", :locals => {:places_container => #restaurants} %>
</div>
<div class="tab-pane" id="tab3">
<%= render :partial => "places", :locals => {:places_container => #businesses} %>
</div>
</div>
</div>
<br />
<% else %>
<%= render 'static_pages/home' %>
<% end %>
Places partial(_places.html.erb):
<table class="table table-hover table-condensed">
<thead>
<tr>
<th>Image</th>
<th>Name</th>
<th>Address</th>
<th>State</th>
<th>City</th>
<th>Type</th>
<th>Website</th>
</tr>
</thead>
<% places_container.each do |place| %>
<tr>
<th><%= image_tag place.image(:medium)%></th>
<th><%= link_to place.name, place %></th>
<td><%= place.address %></td>
<td><%= place.state %></td>
<td><%= place.city %></td>
<td><%= place.category %></td>
<td><%= place.website %></td>
<% if current_user.admin? %>
<td><%= link_to 'Edit', edit_place_path(place) %></td>
<td><%= link_to 'Destroy', place, method: :delete, data: { confirm: 'Are you sure?' } %></td>
<% end %>
</tr>
<% end %>
</table>
Your tabbed results are ignoring the search parameter because you aren't using the #places relation built from the search parameter. To fix, change this code:
def index
if params[:search].present?
#places = Place.near(params[:search], 50, :order => :distance)
else
#places = Place.all
end
#schools = Place.where("category = ?", "School")
#restaurants = Place.where("category = ?", "Restaurant")
#businesses = Place.where("category = ?", "Business")
end
to:
def index
if params[:search].present?
#places = Place.near(params[:search], 50, :order => :distance)
else
#places = Place.scoped # use 'scoped', not 'all', to avoid triggering the query immediately
end
#schools = #places.where("category = ?", "School")
#restaurants = #places.where("category = ?", "Restaurant")
#businesses = #places.where("category = ?", "Business")
end
I implemented a chat system to my app.
It refreshes the list of comments partially when after new comment was submit.
So new added comment pops up without reloading whole page.
It's working fine but the problem is, it won't make input field empty(initialize) after submit :(
How can I make it empty if it succeeded at submitting?
5 seconds Auto-refreshing will be another issue that's preventing.
So I have to care about it, too.
and If possible I want to pop up flash alert 'you cant spam' when the user tried to submit comment within 10 seconds.
Let's assume as if I'm trying to submit comment from Users#show page
views/users/show.html.erb
<%= javascript_tag do %>
jQuery(document).ready(function () {
refreshPartial();
setInterval(refreshPartial, 5000)
});
function refreshPartial() {
$.ajax({
url: "<%= show_user_path(#user) %>/refresh_part",
type: "GET",
dataType: "script",
});
}
<% end %>
......
<span id="chat">
<%= render 'users/comment' %>
</span>
<%= render 'users/comment_input' %>
views/users/_comment.html.erb
<table>
<tr>
<th>ID</th>
<th>PIC</th>
<th>Body</th>
<th>Subject</th>
<th>Posted by</th>
<th>Delete</th>
</tr>
<% #comments.each do |comment| %>
<tr id="<%= dom_id(comment) %>">
<td><%= comment.id %></td>
<td>
<% if comment.comment_icon? %>
<ul class="thumbnails">
<%= image_tag(comment.comment_icon.url(:thumb),:height => 100, :width => 100, :style => 'border:3px double #545565;' ) %>
</ul>
<% end %>
</td>
<td><%= comment.body %></td>
<td><%= comment.subject %></td>
<td><%= comment.user.user_profile.nickname if comment.user.user_profile %></td>
<td>
<%= button_to 'destroy', polymorphic_path([#user, comment]), :data => {:confirm => 'Are you sure?'}, :method => :delete, :disable_with => 'deleting...', :remote => true, :class => 'btn btn-danger' if current_user && current_user.id == comment.user_id %>
</td>
</tr>
<% end %>
</table>
<%= paginate #comments, :window => 4, :outer_window => 5, :left => 2, :right => 2 %>
views/users/_comment_input.html.erb <= This is input form!!!!!
<%=form_for(([#user, #comment]), :remote => true) do |f| %>
<div class="field">
<%= f.label :body %><br />
<%= f.text_field :body %>
</div>
<div class="field">
<%= f.file_field :comment_icon %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
comments_controller.rb
def create
commentable = #community_topic||#community||#user
#comments = commentable.comment_threads.order("updated_at DESC").page(params[:page]).per(5)
#comment = Comment.build_from(commentable, current_user.try(:id), params[:comment][:body])
#comment.comment_icon = params[:comment][:comment_icon]
if #user
#following_users = #user.all_following(order: 'updated_at DESC')
#followed_users = #user.followers
#communities_user = #user.get_up_voted(Community).order("updated_at ASC").page(params[:page]).per(5)
elsif #community
end
last_comment = Comment.where(:user_id => current_user.id).order("updated_at").last
if last_comment && (Time.now - last_comment.updated_at) <= 10.second
flash[:notice] = "You cannot spam!"
render :template => template_for(commentable)
elsif #comment.save
#if #community_topic.empty?
#comments = commentable.comment_threads.order("updated_at DESC").page(params[:page]).per(5)
#comment = commentable.comment_threads.build
respond_to do |format|
format.html { redirect_to [#community, commentable].uniq, :notice => "comment added!" }
format.js do
if #community.present?
render 'communities/refresh_part'
elsif #community_topic.present?
render 'community_topics/refresh_part'
elsif #user.present?
render 'users/refresh_part'
end
end
end
else
render :template => template_for(commentable)
end
end
views/users/refresh_part.js.erb
$('#chat').html("<%= j(render(:partial => 'users/comment')) %>")
Well I assume this is the "body" input you want to empty so basically, just add an id to it like this :
<%= f.text_field :body, :id => "body_input" %>
And in your views/users/refresh_part.js.erb, you can add something like :
$('#body_input').val('');
This should work only if it succeded at submitting because from what I saw, your template is rendered only if the comment is saved.