Je voudrais classer les applications de mémo que je développe. Cette fois, je vais l'évaluer en trois étapes. Parallèlement à cela, nous en apprendrons davantage sur la saisie, l'enregistrement et l'affichage des évaluations par étoiles.
Ajouter une fonction de classement par étoiles avec Rails
Enregistrez la valeur d'évaluation dans la colonne taux (type: float) de la table des notes (table mémo) Nous supposerons que les tables et les colonnes ont déjà été créées.
La colonne doit être de type flottant car elle stockera des valeurs telles que "0,5" et "1,5" lors de l'évaluation avec une demi-étoile.
Si vous l'avez créé en tant que type entier ou chaîne, vous devrez changer le type, bien que la méthode de changement diffère selon la base de données. L'article ci-dessous décrit une solution lorsque vous êtes accro à ce type de marais de changement.
class CreateNotes < ActiveRecord::Migration[5.2]
  def change
    create_table :notes do |t|
      t.text :title
      t.integer :user_id
      t.integer :category_id
      t.text :explanation
      t.float :rate
      t.timestamps
    end
  end
end
rails db:migrate:reset
Tout en vérifiant le lien de référence ci-dessus, chargez javascript et chargez l'image étoile.
Méthode (2 types)
① Pour utiliser jQuery Raty, téléchargez jquery.raty.js depuis https://github.com/wbotelhos/raty.
Placez le script téléchargé n'importe où sur votre site Web.
Placez le fichier jquery.raty.js téléchargé dans le dossier app / javascripts
(2) Chargez JavaScript dans HTML qui utilise jQuery Raty. Puisque Raty est un plugin jQuery, vous avez également besoin d'un script jQuery.
    <script src="/js/jquery.min.js"></script>
    <script src="/js/jquery.raty.js"></script>
Cette fois, nous allons l'implémenter par la méthode de ①.
javascripts / application.js//= require rails-ujs
//= require activestorage
//= require turbolinks
//= require jquery       #ajouter à
//= require jquery_ujs  #ajouter à
//= require_tree .
Ajouter un fichier Gem
gem 'jquery-rails'
budle install
note.rb
class Note < ApplicationRecord
  #Liens avec les utilisateurs
  belongs_to :user,optional: true
 #Validation
  validates :title, presence: true
  validates :explanation, presence: true
  
  #Lien avec la catégorie
  belongs_to :category
  validates :rate, presence: true
  validates :rate, numericality: {
    # only_integer: true,
    less_than_or_equal_to: 3,
    greater_than_or_equal_to: 1,
  }
# Numericality = autoriser vide
la numéricité autorise également les fractions par défaut. Je souhaite uniquement autoriser les nombres entiers dans la colonne de taux, donc uniquement_entier.
Exemple
   validates :param3, :numericality => { :less_than_or_equal_to => 3}
   #Est-ce que le nombre est 3 ou moins?
   validates :param3, :numericality => { :greater_than_or_equal_to => 1 }
   #Est-ce que le numéro est 1 ou plus?
end
notes_controller.rb
class NotesController < ApplicationController
  before_action :authenticate_user!
  def new
    @note = Note.new
  end
  def create
    # @note = Note.new(note_params)
    @note = current_user.notes.build(note_params)
    @note.save
    redirect_to notes_path
  end
  def index
    # is_Obtenez tous les enregistrements qui correspondent
    @categorys = Category.where(is_valid: true)
    @q = Note.all.ransack(params[:q])
    @notes = @q.result(distinct: true)
  end
  def show
    @note = Note.find(params[:id])
  end
  def edit
    @note = Note.find(params[:id])
  end
  def update
    @note = Note.find(params[:id])
    @note.update(note_params)
    redirect_to note_path
  end
  def destroy
    @note = Note.find(params[:id])
    @note.destroy
    redirect_to notes_path
  end
  def search
    @categorys = Category.where(is_valid: true)
    @category = Category.find(params[:id])
    @q = @category.notes.all.ransack(params[:q])
    @notes = @q.result(distinct: true).page(params[:page])
    @title = @category.name
    render 'notes/index'
  end
  private
  def note_params
    params.require(:note).permit(:title, :category_id, :explanation,:user_id,:rate)
  end
end
Ici, nous ajoutons une colonne rate à la méthode note_params.
_form.html.erb
<%= form_with model:note, local: true do |f| %>
  <div class='form-group'>
    <%= f.label :Titre%>
    <%= f.text_field :title, class: 'form-control', id: 'note_title' %>
  </div>
  <div class='form-group'>
    <%= f.label :Catégorie%>
    <%= f.collection_select :category_id, Category.all, :id, :name %>
  </div>
  <!--Évaluation-->
  <div class="form-group row" id="star">
    <%= f.label :rate,'importance', class:'col-md-1 col-form-label' %>
    <%= f.hidden_field :rate, id: :review_star %>
  </div>
  <div class='form-group'>
    <div id='editor'>
      <%= f.label :Contenu%>
      <%= f.text_area :explanation, rows: 10, class: 'form-control', id: 'note_explanation', "v-model" => "input", name: "note[explanation]" %>
    <h2><i class="fas fa-eye"></i> Preview</h2>
    <div id="preview-field" v-html='input | marked'>
    </div>
    <div ></div>
  </div>
  <%= f.submit 'enregistrement', class: 'btn btn-success' %>
  </div>
  <% end %>
  <!--Aperçu en temps réel-->
  <script type="text/javascript">
    window.onload = function() {
      new Vue({
      el: '#editor',
      data: {
        input: '<%== j @note.explanation %>',
      },
      filters: {
      marked: marked,
      },
      });
    };
   <!--Évaluation-->
    $('#star').raty({
      size     : 36,
      starOff:  '<%= asset_path('star-off.png') %>',
      starOn : '<%= asset_path('star-on.png') %>',
      starHalf: '<%= asset_path('star-half.png') %>',
      scoreName: 'note[rate]',
      half: true,
    });
  </script>
Pour pouvoir saisir la moitié de # ★ half: true,
Je veux afficher ★ dans la liste des mémos. La différence par rapport à "Enter and save ★" ci-dessus est que 1. Affichage sans entrée, 2. Répéter le traitement.
_notes_index.html.erb
<div class='row'>
  <table class='table'>
    <thead>
      <tr>
        <th>Titre</th>
        <th>Catégorie</th>
        <th>importance</th>
      </tr>
    </thead>
    <tbody>
      <% @notes.each do |note| %>
      <% if user_signed_in? && current_user.id == note.user_id %>
      <tr>
        <td>
          <%= link_to note_path(note) do %>
            <%= note.title %>
          <% end %>
        </td>
        <td><%= note.category.name %></td>
        <!--Évaluation-->
     <td>
         <div id="star-rate-<%= note.id %>"></div>
          <script>
            //Notez que l'identifiant peut être unique même dans le traitement itératif_Entrez l'identifiant
          $('#star-rate-<%= note.id %>').raty({
            size: 36,
            starOff:  '<%= asset_path('star-off.png') %>',
            starOn : '<%= asset_path('star-on.png') %>',
            starHalf: '<%= asset_path('star-half.png') %>',
            half: true,
            //Je ne peux pas entrer simplement en lisant
            readOnly: true,
            score: <%= note.rate %>,
          });
          </script>
        </td>
      </tr>
      <% end %>
      <% end %>
    </tbody>
  </table>
</div>
<div id="note-rate-<%= note.id %>"></div>
readOnly: true,
score: <%= note.rate %>,
Ceci est terminé!
Veuillez noter que l'explication peut être difficile à comprendre. De plus, s'il y a des erreurs, j'apprécierais que vous puissiez m'apprendre.
Recommended Posts