#<用户:0x00007fa70dc93f40>的未定义方法`reviews'

时间:2019-12-03 07:19:25

标签: ruby-on-rails ruby-on-rails-5

我的应用程序中有3种模型-用户,帖子和评论。用户has_many :posts发布has_many :reviews

要发布信息或发表评论,请先登录用户。

class ReviewsController < ApplicationController    
  def new
    @post = Post.find(params[:post_id])
    @review = Review.new
  end

  def create        
    @post = Post.find(params[:post_id])
    @review = @post.reviews
    @review = current_user.reviews.build(comment_params)
    if @review.save
      flash[:success] = "Hurray!!"
      redirect_to user_path(current_user)
    else
      flash.now[:danger] = "Hurray!!"
      render 'new'
    end

    # @review = current_user.review.post.new(comment_params)
    # @review.save
    # flash[:success] = "Comment Posted succesfully"
    # redirect_to user_path(current_user)

  end

  private

  def comment_params
  #  params.require(:review).permit(:comment)
  params.require(:reviews).permit(:comment)
  end    
end

查看-审核#新

<div class="row">
  <div class="col-md-offset-3 col-md-8">
   <b> Add a review </b>
  </div>
</div>

<%= form_for [@post, @review] do |r| %>
  <div class="row">
   <div class="col-md-offset-3 col-md-7">
     <% render 'errors' %>
   </div>
  </div>
  <div class="row">
    <div class="col-md-offset-3 col-md-7">
      <div class="form-group">
        <%= r.label :comment %>
        <%= r.text_area :comment, class: "form-control" %>
      </div>
      <%= r.submit "Add", class: "btn btn-primary btn-block" %>
    </div>
  </div>
 <% end %>

路线:

Rails.application.routes.draw do
  # root 'posts#index'
  root 'mains#home'
  resources :users 
  resources :posts do 
    resources :reviews
  end
  # resources :reviews
  resource :sessions, only: [:new, :create, :destroy]
  resources :passwords, only: [:new, :create, :edit, :update]    
end

日志中的参数:

 {"authenticity_token"=>"XunDfWighjQFYPmGOuIBMXIaiKzNM1BEDiU5 
 OU2DxvZAvBCP+ERzYSEI/eA/FYIiEPKjo32BX6vqZDm2fQmHrQ==",
 "review"=> {"comment"=>"dsf"}, "commit"=>"Add", "post_id"=>"12"}

任何地方都没有用户ID。正确地传递“ post_id”是正确的吗?

我希望至少能够现在解释这个问题。

1 个答案:

答案 0 :(得分:1)

您需要将user_id添加到Review模型并将其关联。用户has_many :reviews和评论belongs_to :user。使用

添加迁移
def change
  add_reference :reviews, :user, foreign_key: true
end

并更改控制器

class ReviewsController < ApplicationController    
  def new
    @post = Post.find(params[:post_id])
    @review = @post.reviews.new
  end

  def create        
    @post = Post.find(params[:post_id])
    @review = @post.reviews.build(review_params)
    @review.user_id = current_user.id
    if @review.save
      flash[:success] = "Hurray!!"
      redirect_to user_path(current_user)
    else
      flash.now[:danger] = "Hurray!!"
      render 'new'
    end
  end

  private

  def review_params
    params.require(:review).permit(:comment)
  end    
end

是的,将post_id传递给控制器​​是正确的