【问题标题】:Rails - Votes not saving, and creating button that does not submit?Rails - 投票不保存,并创建不提交的按钮?
【发布时间】:2015-07-03 23:55:26
【问题描述】:

所以我正在尝试创建一个视频游戏评论网站以供练习。

一个游戏有很多评论和投票。这个想法是,为了发表评论,您必须先投票“好”或“坏”,然后提交评论。没有投票就不能发表文字评论。

我正在尝试在没有acts_as_voteable gem 的情况下执行此操作...

投票的数据格式是布尔值。 “好”是真的,“坏”是假的。

如何获得要保存的选票?下面是我的 routes.rb、_review partial、reviews 控制器和显示页面。

非常感谢大家:)

edit****:我也试图每个用户只投一票。我正在考虑使用等于 1 的令牌变量,当投票时,令牌是 -1。这是一个好方法吗?但是投票的数据类型是布尔值,那么它是如何工作的 - 或者我应该将投票的数据类型从布尔值更改为整数?

edit#2 -- 所以我在参数中添加了 :vote。

routes.rb

upvote_game_review_path 
POST    /games/:game_id/reviews/:id/upvote(.:format)    reviews#upvote

downvote_game_review_path   
POST    /games/:game_id/reviews/:id/downvote(.:format)  reviews#downvote

Rails.application.routes.draw do

  devise_for :users

  root "games#index"

  resources :games do
    resources :news
    resources :reviews, except: [:show, :index] do
        member do
            post "upvote"
            post "downvote"
        end
    end
  end

  resources :platforms
  resources :genres

end

reviews_controller.rb

class ReviewsController < ApplicationController

    before_action :set_review, only: [:show, :update, :edit, :destroy]
    before_action :set_game
    before_action :authenticate_user!

    def new
        @review = Review.new
    end

    def create
        @review = Review.new(review_params)
        @review.user_id = current_user.id
        @review.game_id = @game.id

        if @review.save
            redirect_to @game
        else
            render "review"
        end
    end

    def upvote
        @review.vote.create = true
        redirect_to @game
    end

    def downvote
        @review.vote.create
        @review.vote = false
        redirect_to @game
    end

    def edit
        @review.update(review.params)
    end

    def destroy
        @review.destroy
        redirect_to @game
    end

    private

    def set_review
        @review = Review.find(params[:id])
    end

    def set_game
        @game = Game.find(params[:game_id])
    end

    def review_params
        params.require(:review).permit(:comment, :vote)
    end

end

_review partial

<%= form_for [@game, @reviews.new] do |r| %>

    <h3 class="post_review">Review this game</h3>

    <p>
        <%= r.text_area :comment %>
    </p>

    <p>
        <%= button_to "Good", upvote_game_review_path(@game.id, r) %>
    </p>

    <p>
        <%= button_to "Bad", downvote_game_review_path(@game.id, r) %>
    </p>

    <p>
        <%= r.hidden_field :game_id, value: @game.id %>
    <p>

    <%= r.submit %>

<% end %>

show.html.erb

<p><%= link_to "<< Home", games_path %></p>
<span><%= link_to "Edit", edit_game_path(@game) %></span>
<span><%= link_to "Delete", game_path(@game), method: :delete %></span>

<div class="game_summary">
    <h2><%= @game.title %></h2>
    <%= image_tag @game.image %>
    <p>Release Date: <%= @game.release_date %> </p>
        <p>Genre: <%= @game.genre_id %> </p>
    <p>Platforms: <%= @game.platform_id %></p>
</div>


<%= link_to "Add News", new_game_news_path(@game) %>
<h2>News & Articles</h2>
<%= link_to "view all", game_news_index_path(@game) %>
<% @news.each do |n| %>
    <ol>
        <li><%= link_to n.title, game_news_path(@game.id, n.id) %></li>
    </ol>
<% end %>


<div class="game_review submit">
    <%= render "review" %>
</div>

<% @reviews.each do |review| %>
    <p><%= review.comment %></p>
    <p><%= link_to "delete", game_review_path(@game.id, review.id), method: :delete %></p>
<% end %>

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    您没有指定要加载的评论。原因在这里:

    before_action :set_review, only: [:show, :update, :edit, :destroy]
    

    当您执行其中任何一项操作时,您都不会拉入请求的审核实例。此外,看起来您实际上并没有保存它们。

    所以,我推荐两件事:

    • 将这些方法添加到您的before_action

      before_action :set_review, only: [:show, :update, :edit,
                                        :destroy, :upvote, :downvote]
      
    • (可能没有必要,编写测试来确认这一点!)实际在更改实体值后保存实体。

      def upvote
        @review.vote.create = true
        @review.save
        redirect_to @game
      end
      
      def downvote
        @review.vote.create unless @review.vote
        @review.vote = false
        @review.save
        redirect_to @game
      end
      

    【讨论】:

    • 不确定您是否解决了每位审阅者一票的想法。这篇文章看起来很有希望stackoverflow.com/questions/4836897/…
    • 大家好,非常感谢您的意见。我尝试了这两种建议,但都没有奏效。 upvoting 仍然无法保存 - 现在 downvote 会出现错误。“找不到带有 'id'=#<:helpers::formbuilder:0x8c98188> 的评论”
    • 您是否为操作提供了 ID?正在为该路线生成的路径是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-25
    • 2015-02-02
    相关资源
    最近更新 更多