ruby-on-rails - 帖子评级 - Rails

标签 ruby-on-rails ruby rating

我正在 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.id 更改为 NULL

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

我不知道这是如何发生的以及如何克服这个问题,所以请帮忙。

它更改了评级数据库,如下所示:

第一列:id,第二列:star,第三列: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

发布模型:

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

帖子 Controller :

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

我是 Rails 新手,我需要在不使用任何 gem 的情况下实现它。 请帮助它如何将我在服务器日志中表示的 post_id 更改为 NULL ..

最佳答案

这是因为在您手动创建评分后,然后转到@posts.update( rating_ids:[5]),它表明该帖子仅应具有评分ID 5,不是 5 星

另外,您确定希望未经身份验证的用户能够访问帖子编辑吗?

关于ruby-on-rails - 帖子评级 - Rails,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34157545/

相关文章:

ruby-on-rails - rails 3 : How to create a new nested resource?

rating - 数独难度等级

ruby-on-rails - 使用 Rspec 打桩 sleep 方法。

javascript - ruby rails : How to identify nested_form elements in javascript functions?

ruby-on-rails - rails (设计/cancan/rolify): more efficient way to get users with certain role

ruby-on-rails - 我可以使用类变量与线程通信吗?

mysql - 将平均评分加入到 MySQL 选择的所有行的末尾

c++ - 任何人都可以清楚地了解如何在 C++ 中获取 tiff 评级元数据,或者仅以 Win Explore 读取的方式获取文件评级吗?

css - 渲染的 PDF 在生产环境中看起来不同 - Rails、PDFKit、wkhtmltopdf

ruby-on-rails - rails 4.2 : Eager-loading has_many relation with STI