简体   繁体   中英

Trying to create comments. (Undefined method 'comment')

I am receiving this error and I don't understand as I have defined the method in the comments controller, haven't I?

I am getting slightly confused to why it is not working.

Comments controller:

class CommentsController < ApplicationController
    def create
        @story = Story.find(params[:story_id])
        @comment = @story.comments.create(params[:comment].permit(:name, :body))
        redirect_to root_path
    end
end

Stories Controller:

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


    def index
        @stories = Story.order('created_at DESC')
    end

    def new
        @story = current_user.stories.build
    end

    def create
        @story = current_user.stories.build(story_params)
        if @story.save
            flash[:success] = "Your beautiful story has been added!"
            redirect_to root_path
        else
            render 'new'
        end
    end

    def edit
        @story = Story.find(params[:id])
    end

    def update
        @story = Story.find(params[:id])
        if @story.update_attributes(params.require(:story).permit(:name, :description))
            flash[:success] = "More knowledge, more wisdom"
            redirect_to root_path
        else
            render 'edit'
        end
    end

    def destroy
        @story = Story.find(params[:id])
        if @story.destroy
            flash[:success] = "I think you should have more confidence in your storytelling"
            redirect_to root_path
        else
            flash[:error] = "Can't delete this story, sorry"
        end
    end

    def show
        @stories = Story.all
    end

    private

    def story_params
        params.require(:story).permit(:name, :description)
    end



    end

Index.html.erb:

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


    <h1>This is a list of posts</h1>

    <table>
        <thead>
            <tr>
                <th>Name</th>
                <th>Description</th>
                <th>User</th>
                <th colspan="3"></th>
            </tr>
        </thead>

        <tbody>
            <% @stories.each do |story| %>
            <tr>
            <td><%= story.name %></td>
            <td><%= story.description %></td>
            <td><%= story.user.username %></td>
            <td><%= link_to 'Show', story %></td>
            <% if user_signed_in? %>
            <td><%= link_to 'Edit', edit_story_path(story)%></td>
            <td><%= link_to 'Destroy', story_path(story),method: :delete,data: { confirm: 'Are you sure?' } %></td>
            <% end %>
            </tr>
        </tbody>
    </table>

        <h2><%= @story.comments.count %>Comments</h2>
                <%= render @story.comments %>
                <h3>Add a comment</h3>
                <%= render 'comments/form' %>

  <%= link_to 'New Story', new_story_path %>

Story Controller:

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

  # GET /comments
  # GET /comments.json
  def index
    @comments = Comment.all
  end

  # GET /comments/1
  # GET /comments/1.json
  def show
  @comments = @story.comments.all
  @comment = @stroy.comments.build
  end

  # GET /comments/new
  def new
    @comment = Comment.new
  end

  # GET /comments/1/edit
  def edit
  end

  # POST /comments
  # POST /comments.json
  def create
    @story = Story.find(params[:story_id])
    @story.comments.create(comment_params)
  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 @comment, notice: 'Comment was successfully updated.' }
        format.json { render :show, status: :ok, location: @comment }
      else
        format.html { render :edit }
        format.json { render json: @comment.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /comments/1
  # DELETE /comments/1.json
  def destroy
    @comment.destroy
    respond_to do |format|
      format.html { redirect_to comments_url, notice: 'Comment was successfully destroyed.' }
      format.json { head :no_content }
    end
  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(:user_name, :body, :story_id)
    end
end

You have to start by understanding how associations works:

One Story will have many comments.

You have to define the association in the model:

class Story < ActiveRecord::Base
  has_many :comments
end

class Comment < ActiveRecord::Base
  belongs_to :story
end

Then the methods in the controller will be available:

class CommentsController < ApplicationController
  def create
    @story = Story.find(params[:story_id])
    @story.comments.create(comment_params)
  end
end

And in your app/stories/show.html.erb view:

<% @story.comments.each do |comment| %>
  <%= comment.body #or the comment content method %>
<% end %>

Make sure you have run the right migrations

  rails g scaffold comment user_name:string body:text story:references

now

rake db:migrate

In your story model write

has_many :comments

And in your comment model make sure you have

belongs_to :story

or in your story controller in the show method have this

@comments = @story.comments.all
@comment = @stroy.comments.build

And now in your story form show views, something like this

<h3>Comments</h3>
<% @comments.each do |comment| %>
  <div>
    <p><%= comment.body %></p>
  </div>
<% end %>
<%= render 'comments/form' %>

In your comment/_form.html.erb add

<%= f.hidden_field :story_id %>

If you want to display on your index edit you like so

  <tbody>
            <% @stories.each do |story| %>
            <tr>
            <td><%= story.name %></td>
            <td><%= story.description %></td>
            <td><%= story.user.username %></td>
            <td><%= link_to 'Show', story %></td>
            <% if user_signed_in? %>
            <td><%= link_to 'Edit', edit_story_path(story)%></td>
            <td><%= link_to 'Destroy', story_path(story),method: :delete,data: { confirm: 'Are you sure?' } %></td>
            <% story.comments.each do |c| %>
              <%= c.body %>
            <% end %>
            <% end %>
            </tr>
        </tbody>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM