在发布帖子评论时,不能再创建,只显示

时间:2013-06-27 12:31:08

标签: ruby-on-rails ruby ruby-on-rails-3.2 comments posts

我正在尝试使用帖子和评论系统,但是我希望每个帖子只能发表一条评论。只有在我尝试创建一个系统时才会显示内容,然后在一个帖子中发表评论7次...示例...

程序模型1正文内容1

Commentmodel1

程序模型1正文内容2

Commentmodel2

程序模型1正文内容3

Commentmodel3

.etc.etc。

对我而言,这是通过创建7种不同的评论模型来实现这一目标的最简单方式,我知道可能有一种更简单的方法,但是作为新的,这似乎是最简单的。然而,我正在努力让一个评论模型只允许一个评论。

在此应用程序中,coach是用户。

以下是涉及的文件,对于模型,程序是基本的Post模型,注释是注释。

程序/ Show.html.erb

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

<p>
  <b>Title:</b><br />
  <%= @program.title %>
</p>

<p>
  <b>Body:</b><br />
  <%= @program.cweekcomments %>
</p>


<%= link_to 'Edit', edit_program_path(@program) %> |
<%= link_to 'Back', programs_path %>

<br /><br /><br />
<i>Comments</i>
<% @program.comments.each do |comment| %> 
  <p>
    <b>Comment:</b>

    <% if comment %>
        <%= comment.body %>
        <br />
        <%= link_to 'Edit', edit_program_comment_path(@program, comment) %> | <%= link_to 'Destroy', [@program, comment] , method: :delete, data: { confirm: 'Are you sure?' } %>
    <% else %>
        <%= form_for([@program, @program.comments.build]) do |f| %>
        <div class="field">
        <%= f.label :body %><br />
        <%= f.text_area :body %>
        </div>
        <div class="actions">
        <%= f.submit %>
        </div>
        <% end %>
    <% end %>
    </p>  
<% end %>

Programs_controller.rb

class ProgramsController < ApplicationController

  before_filter :authenticate_coach!, :except => [:show]


  # GET /programs
  # GET /programs.json

  def index
    @programs = Program.find_all_by_coach_id(current_coach[:id])

    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @programs }
    end
  end

  # GET /programs/1
  # GET /programs/1.json
  def show
    @program = Program.find(params[:id])

    respond_to do |format|
      format.html # show.html.erb
      format.json { render json: @program }
    end
  end

  # GET /programs/new
  # GET /programs/new.json
  def new
    @program = Program.new

    respond_to do |format|
      format.html # new.html.erb
      format.json { render json: @program }
    end
  end

  # GET /programs/1/edit
  def edit
    @program = Program.find(params[:id])
  end

  # POST /programs
  # POST /programs.json
  def create
    @program = Program.new(params[:program])


    respond_to do |format|
      if @program.save
        format.html { redirect_to @program, notice: 'Program was successfully created.' }
        format.json { render json: @program, status: :created, location: @program }
      else
        format.html { render action: "new" }
        format.json { render json: @program.errors, status: :unprocessable_entity }
      end
    end
  end

  # PUT /programs/1
  # PUT /programs/1.json
  def update
    @program = Program.find(params[:id])

    respond_to do |format|
      if @program.update_attributes(params[:program])
        format.html { redirect_to @program, notice: 'Program was successfully updated.' }
        format.json { head :no_content }
      else
        format.html { render action: "edit" }
        format.json { render json: @program.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /programs/1
  # DELETE /programs/1.json
  def destroy
    @program = Program.find(params[:id])
    @program.destroy

    respond_to do |format|
      format.html { redirect_to programs_url }
      format.json { head :no_content }
    end
  end
end

Comments_controller.rb

class CommentsController < ApplicationController

  def new
    @comment = @program.comments.build
  end 

  def create
    @program = Program.find(params[:program_id])
    @comment = @program.comments.create(params[:comment])
    redirect_to program_path(@program)
  end

  def destroy
    @program = Program.find(params[:program_id])
    @comment = @program.comments.find(params[:id])
    @comment.destroy
    redirect_to program_path(@program)
  end

  def edit
    @program = Program.find(params[:program_id])
    @comment = @program.comments.find(params[:id])
  end

   def update
    @program = Program.find(params[:program_id])
    @comment = @program.comments.find(params[:id])

    respond_to do |format|
      #if @program.comments.update_attributes(params[:comment])
      if @comment.update_attributes(params[:comment])
        format.html { redirect_to program_path(@program), notice: 'Comment was successfully updated.' }
        format.json { head :no_content }
      else
        format.html { render action: "edit" }
        format.json { render json: @comment.errors, status: :unprocessable_entity }
      end
      end
    end

end

提前感谢您的帮助,非常感谢!

1 个答案:

答案 0 :(得分:0)

将您的计划评论关系更改为has_one。(has_one:您的program.rb中的评论)

def create
   @program = Program.find(params[:program_id])
   if @program.comment
     flash[:error] = "Cannot comment more than once"
   else
     @comment = @program.comments.create(params[:comment])
     flash[:notice] = "Comment created"
   end
   redirect_to program_path(@program)
end