试图创建评论。 (未定义的方法'评论')

时间:2016-12-01 18:44:35

标签: ruby-on-rails ruby

我收到此错误并且我不明白,因为我在评论控制器中定义了该方法,不是吗?

我对它为什么不起作用感到有些困惑。

评论控制员:

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

故事控制器:

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

2 个答案:

答案 0 :(得分:0)

您必须首先了解协会的运作方式:

One Story会有很多评论。

您必须在模型中定义关联:

class Story < ActiveRecord::Base
  has_many :comments
end

class Comment < ActiveRecord::Base
  belongs_to :story
end

然后控制器中的方法将可用:

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

app/stories/show.html.erb视图中:

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

答案 1 :(得分:0)

确保您运行了正确的迁移

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

现在

rake db:migrate

在你的故事模型中写

has_many :comments

在你的评论模型中确保你有

belongs_to :story

或在show方法中你的故事控制器有这个

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

现在在你的故事形式中显示视图,就像这样

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

在评论/ _form.html.erb中添加

<%= f.hidden_field :story_id %>

如果您希望在索引编辑中显示,那么

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