контроллер не обновляет значения в базе данных при использовании метода .increment - PullRequest
0 голосов
/ 23 февраля 2019

У меня есть контроллер rails, который не обновляет значение в базе данных, когда я вызываю метод .increment!.

Самое смешное, что тот же код работает в методе create

Вот код контроллера

class RequestsController < ApplicationController
  before_action :set_request, only: [:show, :edit, :update, :destroy]

  # GET /requests
  # GET /requests.json
  def index
    @requests = Request.all
  end

  # GET /requests/1
  # GET /requests/1.json
  def show
  end

  # GET /requests/new
  def new
    @request = Request.new
  end

  # GET /requests/1/edit
  def edit
  end

  # POST /requests
  # POST /requests.json
  def create
    @request = Request.new(request_params)
    respond_to do |format|
      if @request.save

        format.html { redirect_to @request, notice: 'Request was successfully created.' }
        format.json { render :show, status: :created, location: @request }

        @request.increment!(:voteCount)

      else
        format.html { render :new }
        format.json { render json: @request.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /requests/1
  # PATCH/PUT /requests/1.json
  def update
    respond_to do |format|
      if @request.update(request_params)
        format.html { redirect_to @request, notice: 'Request was successfully updated.' }
        format.json { render :show, status: :ok, location: @request }

      else
        format.html { render :edit }
        format.json { render json: @request.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /requests/1
  # DELETE /requests/1.json
  def destroy
    @request.destroy
    respond_to do |format|
      format.html { redirect_to requests_url, notice: 'Request was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_request
      @request = Request.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def request_params
      params.require(:request).permit(:artist, :title, :voteCount)
    end

    def upvote
      puts 'upvote'
      request = Request.find(params[:request_id])

      render json: { voteCount: request.voteCount }
      @request.increment!(:voteCount)
      request.increment!(:voteCount)
      request.save
      request.reload

  end


end

Вот HTML

<tbody>
  <% @requests.each do |request| %>
 <tr data-request-id="<%= request.id %>">
   <td id="artist" style="text-align: center"><%= request.artist %></td>
   <td id="songTitle" style="text-align: center"><%= request.title %></td>
   <td style="text-align: center" id="voteCount<%= request.id %>"><%= request.voteCount %></td>
    <td style="text-align: center"><%= button_to 'Vote', request_upvote_path(request.id), remote: true, method: :post, onclick: "upvote(#{request.id})", class: 'upvote', id:"voteButton#{request.id}" %></td> </tr>
   <% end %>

Вот JS, который обновляет счет на странице

$("#ClickMe").attr("disabled", "disabled"); 



function upvote(id) {
    var count = document.getElementById("voteCount" + id).innerHTML;
    count = parseInt(count);
    count = count + 1;
    count = count.toString();
    document.getElementById("voteCount" + id).innerHTML = count;
    document.getElementById("voteButton" + id).disabled = true;
 }

Добавление маршрутов.rb

Rails.application.routes.draw do
  resources :requests do
    post 'upvote', to: 'requests#upvote'
  end
end

1 Ответ

0 голосов
/ 23 февраля 2019

У меня есть 2 вопроса, прежде чем ответить на ваш вопрос

  1. Этот код возвращал какую-либо ошибку, пока вы ее запускаете?
  2. Почему у вас два метода increment!?
  3. У вас есть @requests в вашем шаблоне ERB, что является проблемой, потому что у вас нет @requests переменной экземпляра в вашем контроллере.

.increment! isправильный способ голосования;однако вам необходимо сохранить его, потому что

Только attribute обновлено;Сама запись не сохраняется.

Итак, вам необходимо сохранить свою запись в базе данных

def upvote
  @request = Request.find(params[:request_id])
  @request.increment!(:voteCount)
  @request.save

  render json: { voteCount: @request.voteCount }
end

Возможные ссылки по теме:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...