【问题标题】:No route matches {:action=>"index", :controller=>"comments", :post_id=>nil} missing required keys: [:post_id]没有路由匹配 {:action=>"index", :controller=>"comments", :post_id=>nil} 缺少必需的键:[:post_id]
【发布时间】:2015-09-29 19:11:25
【问题描述】:

这是我遇到的问题,无法解决。现在这发生在登录帐户时。直到昨晚我还没有遇到过这个问题。

这是我的 users_controller.rb,

class UsersController < ApplicationController
  before_action :set_user, only: [:edit, :update, :destroy]
  before_action :correct_user,   only: [:edit ]

  after_action :signed_in_after_register, only: :create 

  def index
    @users = User.all
    @user = User.find(session[:user_id])
    if params[:search]
        @users = User.search(params[:search]).order("created_at DESC")
      else
        @users = User.all.order('created_at DESC')
      end
  end

  def dashboard 
    @user = User.find(session[:user_id]) unless session[:user_id] == ""
    redirect_to login_path, notice: "You're not logged in" unless @user 
    @posts = @user.posts.order("created_at DESC").limit(3)
    @comment = Comment.new 
    @post = Post.new 
  end 

  def newsfeed
    @user = User.find(session[:user_id]) unless session[:user_id] == nil
    redirect_to login_path, notice: "You're not logged in" unless @user 
    @posts = @user.posts.order("created_at DESC").limit(3)
  end

  def nav
    @user = User.find(session[:user_id])
  end
  def posts
    @user = User.find(session[:user_id])
    @posts = @user.posts
  end

  def destroy
    @user = User.find(session[:user_id]) unless session[:user_id] == ""
    redirect_to login_path, notice: "You're not logged in" unless @user 
  end

  def welcome
    @user = User.find(params[:user_id]) unless session[:user_id] == ""
    redirect_to login_path, notice: "You're not logged in" unless @user 
    @user = User.find(session[:user_id])
  end
  def show 
    @user = User.find(params[:user_id]) unless session[:user_id] == ""
    redirect_to login_path, notice: "You're not logged in" unless @user 
    @posts = @user.posts.order("created_at DESC").limit(3)
    @comment = Comment.new 
    @post = Post.new  
  end

  def new
    @user = User.new
    @post = Post.new(params[:post_id])
  end

  def edit
    @user = User.find(params[:user_id]) if params[:user_id]
    redirect_to @dashboard_path unless @user
  end

  def create
    @user = User.new(user_params)

    respond_to do |format|
      if @user.save
        format.html { redirect_to dashboard_path, notice: 'User was successfully created!' }
        format.json { render :profile, status: :created, location: @user }
      else
        format.html { render :new }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
    end
  end

  def update
    if @user == current_user
      respond_to do |format|
        if @user.update(user_params)
          format.html { redirect_to dashboard_path, notice: 'User was successfully updated.' }
          format.json { render :profile, status: :ok, location: @user }
        else
          format.html { render :edit }
          format.json { render json: @user.errors, status: :unprocessable_entity }
        end
      end
    else
      redirect_to dashboard_path, notice: 'You do not have permission to edit the profile of another user.'
    end
  end

  def destroy
    @user.destroy
    respond_to do |format|
      format.html { redirect_to users_url, notice: 'User was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  private
    def set_user
      @user = User.find(params[:id])
    end
    def correct_user
      @user = User.find(params[:id]) unless session[:user_id] == ""

    end
    def signed_in_after_register 
      session[:user_id] = @user.id 
    end

    def user_params
      params.require(:user).permit(:first_name, :last_name, :bio, :comments, :password, :password_confirmation, :email, :age, :profile_picture, :post, :body)
    end
end

这是我的 cmets _form.html.erb,

<%= form_for([@post, @comment]) do |f| %>
    <p>
        <%= f.text_area :body, placeholder: "Write a comment!" %>
    </p>
    <br>
    <p> <%= f.submit %> </p>

<% end %>

这是我的 routes.rb,

Rails.application.routes.draw do

  root 'welcome#welcome'

  get 'login' => 'sessions#login', :as => :login 

  get 'dashboard' => 'users#dashboard', :as => :dashboard

  post 'logging/user' => 'sessions#create'  

  get 'logout' => 'sessions#destroy', :as => :logout 

  get 'about' => 'about'

  get 'newsfeed' => 'users#newsfeed'

  resources :users, except: :show
  get 'profile/:user_id' => 'users#show', as: :profile

  get 'location' => 'location#location' 

  resources  :posts do
    resources :comments
  end

  get 'index' => 'posts#index'

  get 'register' => 'users#new', :as => :register

end

如果你们确实需要查看更多代码,请告诉我,我会发布!提前非常感谢您!

【问题讨论】:

  • 我做到了。那就是那种形式。
  • 如果您前往api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html 并搜索“例如,如果您的资源定义了关联”,您将看到您正在使用的语法示例。它说它只有在(在你的情况下)'@post' 是一个现有对象(保存在数据库中)时才会起作用,你将为该帖子添加评论。我在你的代码中可以看到 @post 也是一个新对象。
  • 您能否添加 cmets_controller.rb 文件,因为根据我们从您的屏幕截图中看到的简短堆栈跟踪,这似乎是问题所在。此外,您的 development.log 中多几行可能有助于显示比屏幕截图更多的错误。

标签: ruby-on-rails ruby


【解决方案1】:

问题是您试图通过传递form_for([@post, @comment]) 创建一个如下所示的 URL:/posts/:post_id/comments@comment 没有保存到数据库是可以的,但是您使用的 @post 必须已经保存到数据库中,因为如果没有 @post 的 ID,您将无法创建该 URL .

一旦@post被保存,它就会有一个ID,所以你可以生成路由:例如/posts/32/comments

检查您的dashboard.html.erb 文件,了解您在哪里使用@posts 并渲染comments/_form.html.erb。你可能有一个post 对象可用,你应该在你的表单中使用它:form_for([post, @comment])

您可能还想从#dashboard 控制器操作中删除@post = Post.new 行。

【讨论】:

  • 您能再解释一下吗?在按照您所说的删除@post 之后,我在此 url /posts/:post_id/cmets 上收到以下错误,Could't find Post with 'id'=24
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多