0

なので、ユーザーがコメントできるようにしてほしいです。現時点では、名前フィールドに任意の名前を入力するだけで誰でもコメントできます。

しかし、コメントをユーザーに関連付けたいと思います。そのため、コメント フォームの名前フィールドはユーザー名になるため、不要になります。

これはどのように行うことができますか?

私は Ryan Bates の railscast をフォローしましたが、彼は決してコメントとユーザーを関連付けません。

コメント_コントローラー.rb

class CommentsController < ApplicationController
  before_action :set_comment, only: [:show, :edit, :update, :destroy]


  def index
    @comments = Comment.where("song_id IS NOT ?", nil)
  end

  def show
  end

  # GET /comments/new
  def new
  end

  # GET /comments/1/edit
  def edit
  end

  # POST /comments
  # POST /comments.json
  def create
    @comment = Comment.new(comment_params)    

    respond_to do |format|
      if @comment.save
        format.html { redirect_to song_url(@comment.song_id), notice: 'Comment was successfully created.'  }
        format.json { render action: 'show', status: :created, location: @comment}
      else
        format.html { render action: 'new' }
        format.json { render json: @comment.errors, status: :unprocessable_entity }
      end
    end
  end


  # PATCH/PUT /comments/1
  # PATCH/PUT /comments/1.json
  def update
    respond_to do |format|
      if @comment.update(comment_params)
        format.html { redirect_to song_url(@comment.song_id), 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

  # DELETE /comments/1
  # DELETE /comments/1.json
  def destroy
    @comment.destroy
      redirect_to song_url(@comment.song_id)
    end

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

    # Never trust parameters from the scary internet, only allow the white list through.
    def comment_params
      params.require(:comment).permit(:song_id, :author_name, :site_url, :content, :user_id)
    end
end

user.rb

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :token_authenticatable, :confirmable,
  # :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  has_many :songs
  has_many :comments

  acts_as_voter

end

コメント.rb

class Comment < ActiveRecord::Base

  belongs_to :user
  belongs_to :song
end

コメント#form.html.erb

<%= form_for @comment do |f| %>
  <% if @comment.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@comment.errors.count, "error") %> prohibited this comment from being saved:</h2>

      <ul>
      <% @comment.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>


    <div id="comment_form">
  <div class="field">
     <%= f.hidden_field :song_id %>
      <p>
        <%= f.text_field :author_name, placeholder: "Name"  %>
      </p>

      <p>
        <%= f.text_area :content, :rows => '12', :cols => 35, placeholder: "Leave a comment..."  %>
      </p>
      <p><%= f.submit "Submit" %></p>
    <% end %>
    <br /><br />

    </div></div>
4

1 に答える 1

1

テーブルに名前が付いていない場合Commentは、名前付きの列が必要です。次に、 2 つの異なる方法user_idを割り当てることができます。user_idこれらは、メソッドがあることを前提としていますcurrent_user。そうでない場合は、使用しているセッション ストアまたはメソッドから user_id を入力する必要があります。

フォームに hidden_​​field を作成して割り当てることができます。

<%= f.hidden_field :user_id, value: current_user.id %>

ただし、@ rmagnum2002 が指摘したように、ユーザーがこれを編集できるため、これはセキュリティ上の問題になる可能性があります。

create アクション中に割り当てることができます。

def create
  @comment = Comment.new(comment_params)
  @comment.user_id = current_user.id

  respond_to do |format|
    if @comment.save
      format.html { redirect_to song_url(@comment.song_id), notice: 'Comment was successfully created.'  }
      format.json { render action: 'show', status: :created, location: @comment}
    else
      format.html { render action: 'new' }
      format.json { render json: @comment.errors, status: :unprocessable_entity }
    end
  end
end

コントローラーの作成アクションでこれを割り当てるのがおそらく最善です。

于 2013-08-01T03:08:18.143 に答える