我有一个Ruby on Rails应用程序,应该有助于审查医院。 到目前为止,我遵循了一个关闭的教程来构建一个相当可行的应用程序。
我正在尝试为应用添加更多新功能
我可以在索引/家庭用户上成功显示医院,图片和电话号码,但很难显示每家医院所有评论的平均评分。 这很奇怪,因为我在各个医院的展示页面上都有完全相同的结构,并且在那里工作正常。
我觉得我只是几步之遥,需要帮助。请参阅以下代码段:
index.html.erb
<div class="jumboFluid">
<div class="jumbotron">
<section class="content">
<%= form_tag search_hospitals_path, method: :get, class: "form-group" do %>
<div class="input-group">
<div class="input-group-addon">Search</div>
<p>
<%= text_field_tag :search, params[:search], class: "form-control formInput", placeholder: "Eye, Maternity" %>
<%# <%= submit_tag "Search", name: nil, class: "btn btn-default" %>
</p>
</div>
</div>
<% end %>
</section>
</div>
</div>
<div class="hospitalList">
<h1 id="hospitalBanner">Hospitals</h1>
<blockquote>
<p class="text-center"><cite>“Explore the best of healthcare available in your community”</cite> </p>
</blockquote>
<% content_for(:body_attributes) do %>
data-no-turbolink="false"
<% end %>
<div class="container-fluid">
<div class="row">
<% @hospitals.each do |hospital| %>
<div class="col-md-3">
<div class="thumbnail">
<%= link_to image_tag(hospital.image), hospital %>
<div class="caption">
<p> <%= link_to hospital.name, hospital %></p>
<p> <%= hospital.phone %></p>
</div>
</div>
</div>
<% end %>
</div>
<br>
<% if user_signed_in? && current_user.admin? %>
<%= link_to 'New Hospital', new_hospital_path, class: "btn btn-link" %>
<% end %>
<script>
$('.star-rating').raty({
path: 'https://s3-us-west-2.amazonaws.com/morafamedapp/stars',
readOnly: true,
score: function() {
return $(this).attr('data-score');
}
});
</script>
</div>
工作展示代码
show.html.erb
<div class="row">
<div class="col-md-3">
<%= image_tag @hospital.image_url unless @hospital.image.blank? %>
<h3>
<%= @hospital.name %>
</h3>
<div class="star-rating" data-score= <%= @avg_rating %> ></div>
<p><%= "#{@reviews.length} reviews" %></p>
<%= social_share_button_tag("Share") %>
<p>
<strong>Address:</strong>
<%= @hospital.address %>
</p>
<p>
<strong>Phone:</strong>
<%= @hospital.phone %>
</p>
<p>
<strong>Website:</strong>
<%= link_to @hospital.website, @hospital.website, target: :_blank %>
</p>
<%= link_to "Write a Review", new_hospital_review_path(@hospital), class: "btn btn-primary" %>
<br>
<br>
<iframe width="230" height="230" frameborder="0" style="border:0"
src="https://www.google.com/maps/embed/v1/place?q=<%= @hospital.address.parameterize %>&key=AIzaSyAc4mTzAGIA_8JFXAcL3XTBi-tzuxQCsBc" allowfullscreen></iframe>
</div>
<div class="col-md-9">
<% if @reviews.blank? %>
<h3>No reviews yet. Be the first to write one!</h3>
<% else %>
<table class="table">
<thead>
<tr>
<th class="col-md-3"></th>
<th class="col-md-9"></th>
</tr>
</thead>
<tbody>
<% @reviews.each do |review| %>
<tr>
<td>
<h4>
<%= "#{review.user.first_name.capitalize} #{review.user.last_name.capitalize[0]}." %>
</h4>
<p><%= review.created_at.strftime("%-d/%-m/%y") %></p>
</td>
<td>
<div class="star-rating" data-score= <%= review.rating %> ></div>
<p><%= h(review.comment).gsub(/\n/, '<br/>').html_safe %></p>
<%= social_share_button_tag("Share") %>
<% if user_signed_in? %>
<% if (review.user == current_user) || (current_user.admin?) %>
<%= link_to "Edit", edit_hospital_review_path(@hospital, review) %>
<%= link_to "Delete", hospital_review_path(@hospital, review), method: :delete %>
<% end %>
<% end %>
</td>
</tr>
<% end %>
</tbody>
</table>
<% end %>
</div>
</div>
<%= link_to 'Edit', edit_hospital_path(@hospital), class: "btn btn-link" %> |
<%= link_to 'Back', hospitals_path, class: "btn btn-link" %>
<script>
$('.star-rating').raty({
path: 'https://s3-us-west-2.amazonaws.com/morafamedapp/stars',
readOnly: true,
score: function() {
return $(this).attr('data-score');
}
});
</script>
hospital.rb
class Hospital < ApplicationRecord
mount_uploader :image, ImageUploader
searchkick
has_many :reviews
def self.import(file)
CSV.foreach(file.path, headers: true) do |row|
Hospital.create! row.to_hash
end
end
def self.avg_rating
Hospital.avg_rating
end
end
show.html.erb
<h3>
<%= @hospital.name %>
</h3>
<%= @hospital.avg_rating %>
<p><%= "#{@reviews.length} reviews" %></p>
错误
Showing /Users/oluwaseunmorafa/medaapp1/app/views/hospitals/show.html.erb where line #9 raised:
undefined method `avg_rating' for #<Hospital:0x007fd846496ee0>
Extracted source (around line #9):
7
8
9
10
11
12
</h3>
<%= @hospital.avg_rating %>
<p><%= "#{@reviews.length} reviews" %></p>
答案 0 :(得分:0)
在Hospital
类中,您定义了一个类方法而不是实例方法。因此,请删除self.avg_rating
方法,然后写:
def avg_rating
review.average(:rating)
end
然后在您的观看中(在展示和索引中),您可以参考hospital.avg_rating
来显示评分。