2015-07-03 67 views
0

所以我試圖創建一個電子遊戲審查網站的實踐。Rails - 投票不保存,並創建不提交按鈕?

遊戲有很多評論和投票。這個想法是,爲了發佈評論,你必須首先投票「好」或「壞」,然後提交評論。未經投票,您無法發佈文字評論。

我試圖做到這一點,而不acts_as_voteable寶石...

選票的數據格式是布爾值。 「好」是真的,「壞」是假的。

我如何獲得投票保存?下面是我的routes.rb,_review部分,評論控制器和顯示頁面。

非常感謝球員:)

編輯****:還我想每個用戶只有一票。我正在考慮使用等於1的標記變量,並且在投票時,標記爲-1。這是一個好方法嗎?但是投票的數據類型是布爾型的,那麼如何工作 - 或者我應該將投票數據類型從布爾型更改爲整型嗎?

編輯#2 - 所以我補充說:投入我的參數。

的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部分< - 創建一個新的審查

<%= 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 %> 

回答

0

你不指定複習您加載的原因是在這裏:

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 
    
+0

不知道你解決每個評審一票的想法。這篇文章看起來很有希望http://stackoverflow.com/questions/4836897/validate-the-number-of-has-many-items-in-ruby-on-rails。 –

+0

你好,非常感謝你的投入。我嘗試了兩個建議,但都沒有成功。 upvoting仍然不會保存 - 並downvote現在給出了一個錯誤..「無法找到評論與'id'=#」 – giantqtipz

+0

你是否提供的行動ID?該路線正在生成的路徑是什麼? – Makoto