Ruby on rails 我的项目上出现Rails 4路由(或缺少ID)错误&;版本协会
我在这里遇到了一些真正的麻烦-我有一个项目模型和控制器,还有一个版本模型和控制器。用户创建项目的版本,在项目配置文件中,我有一个指向版本索引页面的链接,该页面应仅显示该特定项目的版本。该页面的URL应为“projects/[project\u id]/versions”…但我收到以下错误: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: --
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