Ruby on rails 我的项目上出现Rails 4路由(或缺少ID)错误&;版本协会

Ruby on rails 我的项目上出现Rails 4路由(或缺少ID)错误&;版本协会,ruby-on-rails,ruby-on-rails-4,routing,rails-routing,link-to,Ruby On Rails,Ruby On Rails 4,Routing,Rails Routing,Link To,我在这里遇到了一些真正的麻烦-我有一个项目模型和控制器,还有一个版本模型和控制器。用户创建项目的版本,在项目配置文件中,我有一个指向版本索引页面的链接,该页面应仅显示该特定项目的版本。该页面的URL应为“projects/[project\u id]/versions”…但我收到以下错误: Showing /Users/user/Documents/clones/collab/app/views/versions/index.html.erb where line #46 raised: --

我在这里遇到了一些真正的麻烦-我有一个项目模型和控制器,还有一个版本模型和控制器。用户创建项目的版本,在项目配置文件中,我有一个指向版本索引页面的链接,该页面应仅显示该特定项目的版本。该页面的URL应为“projects/[project\u id]/versions”…但我收到以下错误:

Showing /Users/user/Documents/clones/collab/app/views/versions/index.html.erb where line #46 raised:

-------
undefined method `id' for nil:NilClass
Extracted source (around line #46):

     <ul class="nav nav-pills"> 
       <li class="active"><%= link_to "Current State", @project %></li>
       <li>
         <%= link_to "Version History", project_versions_path(@project.id) %>
       </li>
       <li><a href="#"><span class="badge pull-right">12</span>Collaborators</a></li>  
       <li><a href="#"><span class="badge pull-right">6</span>Issues</a></li>
-------
项目模式:

class Project < ActiveRecord::Base
  has_many :users
  has_many :versions, dependent: :destroy
  validates :title, presence: true, length: { maximum: 100 }
  validates :background, presence: true
  validates :user_id, presence: true

  default_scope -> { order('created_at DESC') }
end
class项目{order('created_at DESC')}
结束
项目控制员:

class ProjectsController < ApplicationController
  before_filter :signed_in_user, only: [:create, :new, :edit, :update]

  def new
    @project = Project.new
  end

  def show
     @project = Project.find(params[:id])
     @user = User.where(:id => @project.user_id).first
  end

  def index
    @projects = Project.paginate(page: params[:page])
  end

  def create
    @project = current_user.projects.build(project_params)
    if @project.save
      flash[:success] = "Welcome to your new project."
      redirect_to @project
    else
      render 'new'
    end
  end

  def edit

  end

  def update
    @project = Project.find(params[:id])
    if @project.update_attributes(params[:project])
      flash[:success] = "Project Created"
      redirect_to @project
    else
      render 'edit'
    end
  end

  def destroy
    User.find(params[:id]).destroy
    flash[:success] = "Project destroyed"
    redirect_to users_path
  end

  private

    def project_params
      params.require(:project).permit(:title, :background)
    end

end
class VersionsController < ApplicationController
  def new
    @version = Version.new
  end

  def show
    @project = Project.find(params[:project_id])
    @version = Version.find(params[:id])
  end

  def index
    @versions = Version.paginate(page: params[:page])
  end

  def create
    @project = Project.find(params[:project_id])
    @version = @project.versions.create(version_params)
    if @version.save
      flash[:success] = "You've successfully added a version to this branch..."
      redirect_to project_path(@project)
    else
      render 'new'
    end
  end

  def edit

  end

  def update

  end

  def destroy

  end

  private

    def version_params
      params.require(:version).permit(:title)
    end
end
class ProjectsController@project.user\u id)。第一个
结束
def索引
@projects=Project.paginate(第页:参数[:第页])
结束
def创建
@project=当前用户.projects.build(项目参数)
如果@project.save
flash[:success]=“欢迎使用您的新项目。”
将_重定向到@project
其他的
呈现“新”
结束
结束
定义编辑
结束
def更新
@project=project.find(参数[:id])
if@project.update_属性(参数[:project])
flash[:success]=“已创建项目”
将_重定向到@project
其他的
渲染“编辑”
结束
结束
def销毁
User.find(params[:id]).destroy
flash[:success]=“项目已销毁”
将\u重定向到用户\u路径
结束
私有的
def项目参数
参数要求(:项目)许可证(:头衔,:背景)
结束
结束
项目展示(项目简介):


创建于

“向右拉”do%>
私有的

  • 文件附件
    最新版本
版本型号:

class Version < ActiveRecord::Base
  belongs_to :project
  validates :title, presence: true, length: { maximum: 140 }

  default_scope -> { order('created_at DESC') }
end
类版本{order('created_at DESC')}
结束
版本控制器:

class ProjectsController < ApplicationController
  before_filter :signed_in_user, only: [:create, :new, :edit, :update]

  def new
    @project = Project.new
  end

  def show
     @project = Project.find(params[:id])
     @user = User.where(:id => @project.user_id).first
  end

  def index
    @projects = Project.paginate(page: params[:page])
  end

  def create
    @project = current_user.projects.build(project_params)
    if @project.save
      flash[:success] = "Welcome to your new project."
      redirect_to @project
    else
      render 'new'
    end
  end

  def edit

  end

  def update
    @project = Project.find(params[:id])
    if @project.update_attributes(params[:project])
      flash[:success] = "Project Created"
      redirect_to @project
    else
      render 'edit'
    end
  end

  def destroy
    User.find(params[:id]).destroy
    flash[:success] = "Project destroyed"
    redirect_to users_path
  end

  private

    def project_params
      params.require(:project).permit(:title, :background)
    end

end
class VersionsController < ApplicationController
  def new
    @version = Version.new
  end

  def show
    @project = Project.find(params[:project_id])
    @version = Version.find(params[:id])
  end

  def index
    @versions = Version.paginate(page: params[:page])
  end

  def create
    @project = Project.find(params[:project_id])
    @version = @project.versions.create(version_params)
    if @version.save
      flash[:success] = "You've successfully added a version to this branch..."
      redirect_to project_path(@project)
    else
      render 'new'
    end
  end

  def edit

  end

  def update

  end

  def destroy

  end

  private

    def version_params
      params.require(:version).permit(:title)
    end
end
class versioncontroller
版本索引(Url将是“projects/[project\u id]/VERSIONS”



  • 版本历史

您在
app/views/versions/index.html.erb的视图正在查找
@project.id
,但未定义
@project

您需要在
索引
操作中为
@project
设置一个值。我建议在执行
操作之前将其重构为
,以稍微整理一下控制器:

class VersionsController < ApplicationController
  # Also add other actions that need for @project to be set (or leave out the `only`
  # option for ALL actions, which almost certainly applies to your situation with a nested
  # resource like this)
  before_action :find_project, only: [:index, :show, :create]

    def show
      @version = Version.find(params[:id])
    end

    def index
      @versions = Version.paginate(page: params[:page])
    end

    def create
      @version = @project.versions.create(version_params)
      if @version.save
        flash[:success] = "You've successfully added a version to this branch..."
        redirect_to project_path(@project)
      else
        render 'new'
      end
    end

  private

    def find_project
      @project = Project.find(params[:project_id])
    end

    #...
end
class versioncontroller
谢谢Chris-我按照你的建议添加了before_操作…但现在我得到了这个错误:versionController中的NameError#索引未定义的局部变量或方法#Rails.root:/Users/user/Documents/clone/collaboration忽略上面的注释,Chris…(我的输入错误)。成功了-非常感谢你的提示!
class VersionsController < ApplicationController
  # Also add other actions that need for @project to be set (or leave out the `only`
  # option for ALL actions, which almost certainly applies to your situation with a nested
  # resource like this)
  before_action :find_project, only: [:index, :show, :create]

    def show
      @version = Version.find(params[:id])
    end

    def index
      @versions = Version.paginate(page: params[:page])
    end

    def create
      @version = @project.versions.create(version_params)
      if @version.save
        flash[:success] = "You've successfully added a version to this branch..."
        redirect_to project_path(@project)
      else
        render 'new'
      end
    end

  private

    def find_project
      @project = Project.find(params[:project_id])
    end

    #...
end