2015-12-08 45 views
3

我正在實施評分系統的軌道職位。的帖子評分 - Rails

查看帖子後,您可以點擊單選按鈕來評價帖子。 以下是代碼。考慮只有帖子和評級不考慮標籤,主題..

而且我的概念中沒有用戶可以在他需要的時候評分,它應該與帖子的現有評分相加。

但是,當我這樣做在其記錄顯示以下內容:

服務器日誌:

Started PATCH "/posts/34" for 127.0.0.1 at 2015-12-08 18:36:55 +0530 
Processing by PostsController#update as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"l3aae99V424OyKVt5ULmqX2Mcs7DY2GYBskbLyhqqNENDn24ldCDAt4gNcgjESlFR6eaP0vcvrcoOerGE9lH5A==", "post"=>{"rating_ids"=>["5"]}, "commit"=>"Rate", "id"=>"34"} 
    Post Load (0.0ms) SELECT "posts".* FROM "posts" WHERE "posts"."id" = ? LIMIT 1 [["id", 34]] 
    CACHE (0.0ms) SELECT "posts".* FROM "posts" WHERE "posts"."id" = ? LIMIT 1 [["id", "34"]] 
    (0.0ms) begin transaction 
    SQL (4.0ms) INSERT INTO "ratings" ("star", "post_id", "created_at", "updated_at") VALUES (?, ?, ?, ?) [["star", 5], ["post_id", 34], ["created_at", "2015-12-08 13:06:55.626133"], ["updated_at", "2015-12-08 13:06:55.626133"]] 
    (216.0ms) commit transaction 
    (0.0ms) begin transaction 
    Rating Load (1.0ms) SELECT "ratings".* FROM "ratings" WHERE "ratings"."id" = ? LIMIT 1 [["id", 5]] 
    Rating Load (0.0ms) SELECT "ratings".* FROM "ratings" WHERE "ratings"."post_id" = ? [["post_id", 34]] 
    SQL (2.0ms) UPDATE "ratings" SET "post_id" = NULL WHERE "ratings"."post_id" = ? AND "ratings"."id" IN (4, 25) [["post_id", 34]] 
    SQL (3.0ms) UPDATE "ratings" SET "post_id" = ?, "updated_at" = ? WHERE "ratings"."id" = ? [["post_id", 34], ["updated_at", "2015-12-08 13:06:55.878147"], ["id", 5]] 
    (170.0ms) commit transaction 
Redirected to http://localhost:3000/topics/9 
Completed 302 Found in 489ms (ActiveRecord: 397.0ms) 

它改變了post.idNULL

SQL (2.0ms) UPDATE "ratings" SET "post_id" = NULL WHERE "ratings"."post_id" = ? AND "ratings"."id" IN (4, 25) [["post_id", 34]] 

我不不知道這是怎麼發生的以及如何克服這一點所以,請幫助。

它改變如下評定數據庫:

第1列:ID,第2列:明星,第3列:POST_ID

1,1,NULL 
2,2,NULL 
3,3,NULL 
4,4,NULL 
5,5,34 
6,4,NULL 
7,1,NULL 
8,1,NULL 
9,5,NULL 
10,1,NULL 
11,5,NULL 
12,1,NULL 
13,4,NULL 
14,3,NULL 
15,4,NULL 
16,4,NULL 
17,4,NULL 
18,2,NULL 
19,1,NULL 
20,5,NULL 
21,3,NULL 

Post模型:

class Post < ActiveRecord::Base 
    belongs_to :topic 
    has_many :comments 
    has_and_belongs_to_many :tags 
    has_many :ratings 
end 

評級模型:

class Rating < ActiveRecord::Base 
    belongs_to :post 
end 

後show.html.erb

<p id="notice"><%= notice %></p> 

<p> 
    <strong>Name:</strong> 
    <%= @posts.name %> (
    <%= @posts.topic.name %>) 
</p> 

<p> 
    <strong>Email:</strong> 
    <%= @posts.email %> 
</p> 

<p> 
    <strong>Message:</strong> 
    <%= @posts.message %> 
</p> 

<strong>Tags:</strong> 
<% @posts.tags.each do |tag| %> 
    <div> 
     <%= tag.name %> <br> 
    </div> 
<% end %> 
<br> 

<strong>Rating:</strong> 
<%= @posts.ratings.group(:star).count %> 


<%= form_for @posts do |f| %> 
    <% (1..5).each do |rating| %> 

     <%= radio_button_tag "post[rating_ids][]", rating %> 
     <%= rating %> 

<% end %> 

<%= f.submit('Rate') %> 

<% end %> 


<%= link_to 'Comments', post_comments_path(@posts) %> 
<%= link_to 'Edit', edit_post_path(@posts) %> | 
<%= link_to 'Back', topic_posts_url(@posts.topic) %> 

柱控制器:

class PostsController < ApplicationController 
    before_action :set_post, only: [:show, :edit, :update, :destroy] 

    # GET /posts 
    # GET /posts.json 
    def index 
    if params[:topic_id].to_i > 0 
      @topic = Topic.find(params[:topic_id]) 
      @posts = @topic.posts.paginate(page: params[:page], per_page: 10) 
    else 
     @posts = Post.eager_load(:topic).paginate(page: params[:page], per_page: 10) 
    end 
    end 

    # GET /posts/1 
    # GET /posts/1.json 
    def show 
     @posts = Post.find(params[:id]) 
     @tags = @posts.tags 
     @comment = Comment.new(:post => @posts) 
    end 

    # GET /posts/new 
    def new 
     @topic = Topic.find(params[:topic_id]) 
    @posts = @topic.posts.new 
    end 

    # GET /posts/1/edit 
    def edit 
    @posts = Post.find(params[:id]) 
    @tags = @posts.tags 
    end 

    # POST /posts 
    # POST /posts.json 
    def create 
     @topic = Topic.find(params[:topic_id]) 
    @posts = @topic.posts.build(post_params) 

    respond_to do |format| 
     if @posts.save 
     format.html { redirect_to topic_url(@posts.topic_id), notice: 'Post was successfully created.' } 
     format.json { render :show, status: :created, location: @posts } 
     else 
     format.html { render :new } 
     format.json { render json: @posts.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # PATCH/PUT /posts/1 
    # PATCH/PUT /posts/1.json 
    def update 

    @posts = Post.find(params[:id]) 
    @tags = @posts.tags 
    respond_to do |format| 
     @posts.ratings.create(:star => params[:post][:rating_ids][0].to_i) 
     if @posts.update(post_params) 

     format.html { redirect_to topic_url(@posts.topic_id), notice: 'Post was successfully updated.' } 
     format.json { render :show, status: :ok, location: @posts } 
     else 
     format.html { render :edit } 
     format.json { render json: @posts.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # DELETE /posts/1 
    # DELETE /posts/1.json 
    def destroy 
    @posts.destroy 
    respond_to do |format| 
     format.html { redirect_to topic_url(@posts.topic_id), notice: 'Post was successfully destroyed.' } 
     format.json { head :no_content } 
    end 
    end 

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

    # Never trust parameters from the scary internet, only allow the white list through. 
    def post_params 
     params.require(:post).permit(:name, :email, :message, :topic_id, {tag_ids:[]}, rating_ids:[]) 
    end 
end 

我新的軌道,我需要實現這一點沒有使用任何寶石.. 請幫助它如何更改POST_ID爲NULL我在服務器日誌中記..

+0

我想你應該結合Vasfed和Omar Mowafi答案中的暗示。出於好奇,你在'Post'模型中使用'accep_nested_pa​​rameters_for:ratings'嗎? – jphager2

回答

2

這是因爲你創建了一個Rating後手動然後去@posts.update(rating_ids:[5]),其中指出,這個職位只應該有等級ID爲5,而不是5星

加上你肯定希望你的未經授權的用戶能夠訪問後編輯?

2

由於您在更新後改變之前保存您的評級至post_params

def post_params 
    params.require(:post).permit(:name, :email, :message, :topic_id, {tag_ids:[]}) 
end 

如你節省直接從PARAMS評級。

但是,您應該考慮更改結構以使用類似嵌套屬性的內容,這些屬性會自動保存/更新評分。