我是开发新手,也是Rails新手。
我有两个资源项目和pod。//pod就像子项目
——配置/routes.rb
resources :projects
resources :pods
模型/project.rb ,
class Project < ActiveRecord::Base
attr_accessible :description, :name
**has_many :pods, dependent: :destroy**
before_save { |project| project.name = name.upcase }
validates :name, presence: true, length: { maximum: 50 }, uniqueness: { case_sensitive: false }
validates :description, presence: true
end
模型/pod.rb ,
class Pod < ActiveRecord::Base
attr_accessible :description, :name
belongs_to :project
before_save { |pod| pod.name = name.upcase }
validates :name, presence: true, length: { maximum: 50 }, uniqueness: { case_sensitive: false }
validates :description, presence: true
validates :project_id, presence: true
default_scope order: 'pods.created_at DESC'
end
在项目视图中,我有一个链接来创建一个pod
<p> <%= link_to "Create new Pod", new_pod_path(project: @project.id) %></p>
这里我将项目id发送到new_pod_path,以便在创建pod时,它可以与这个特定的项目相关联。
——豆荚控制器——
def new
@project = Project.find_by_id(params[:project])
@pod = Pod.new
end
def create
@pod = @project.pods.build(params[:pod])
if @pod.save
flash[:success] = "Congratulaions! You have created a new pod."
redirect_to @pod
else
render 'new'
end
end
======================
当我点击'Create new pod'链接时,表单显示出来,在调试参数中,我看到
project: '1'
action: new
controller: pods
我填写详细信息并单击提交,我得到以下错误
NoMethodError in PodsController#create
undefined method `pods' for nil:NilClass
我不知道这里发生了什么。我现在不想有嵌套的资源,因为pods将有测试套件,然后测试套件将有测试用例。
任何帮助都将非常感激
=====================================编辑——
我不知道哪里出错了。让我说得更清楚些。我有一个项目显示页面,其中new_pod_path与项目id ----
<%= link_to "Create new Pod", new_pod_path(project_id: @project.id) %>
" ----------指向Pod控制器中的新操作。代码为----- def new
@project = Project.find(params[:project_id])
@pod = Pod.new
end
我需要在新的行动中找到项目吗?
新的pod视图:
<%= f.hidden_field :project_id, value: @project.id %>
//我猜从新的方法,视图将能够看到@project。id和包括上述代码在新的行动中找到项目是有意义的//请纠正我,如果我错了--------
然后创建--------
def create
@project = Project.find_by_id(params[:project_id])
@pod = @project.pods.build(name: params[:name], description: params[:description])
if @pod.save ...
我不知道发生了什么事。如果您能告诉我流,例如—项目显示页面—调用new_pod_path,并在参数中使用项目id。新pod操作获取该id并查找项目或以某种方式使其在新pod表单中可用。新的pod表单使用该id并作为hidden_field传递。然后create操作通过参数获取隐藏字段并找到项目并创建project.pods.build(…)我真的很感激
------------- 服务器日志 ------------- 似乎问题与项目id ----------在2013-03-15 17:55:56 -0700为127.0.0.1启动POST "/pods处理由podscontroller#创建为HTML参数:{"utf8"=>"✓","authenticity_token"=>" fxco0kughhvtrh79d4vcrhwjakdgq8ckqmijle0ov4 =", "pod"=>{"project_id"=>"1", "name"=>"sdf", "description"=>"df"}, "commit"=>"Create new pod"}User Load (0.4ms)选择"users"。* FROM"users"WHERE"users"。"remember_token" = '70InmWq61iFCnjzuxhBP6g' LIMIT项目加载(0.2ms)选择"projects"。* FROM"projects"WHERE"projects"。"id"是NULL限制14毫秒内完成500个内部服务器错误
NoMethodError(未定义的方法pods' for nil:NilClass):
app/controllers/pods_controller.rb:23:in
创建'
在create you are missing
@project = Project.find(params[:project])
确保project_id
在参数键:project
在请求时需要重新创建视图变量@
。
你如何把project_id在参数哈希它看起来是错误的(project_id"=>{"1"=>""},
)(得到那个id你做params[:project_id].first.key
,但那是丑陋的)
如果你喜欢建议的代码,
<%= hidden_field 'project', @project.id %> <!--@project initialized in new -->
或者
<%= hidden_field 'project', params[:project] %> <!--params[:project] coming from the new request -->
那么params[:project]
会给你id 1
您的实例变量@pod
为nil,这意味着您的方法将引发异常。你必须用一些东西来完成你的@pod
,然后才能使用方法来实现它
以new pod
的形式使用hidden_field_tag
:
<%= hidden_field_tag 'project_id', @project.id %> #Add this line in new pod form
控制器的变化:
def create
@project = Project.find(params[:project_id])
@pod = @project.pods.build(params[:pod])
if @pod.save
flash[:success] = "Congratulaions! You have created a new pod."
redirect_to @pod
else
render 'new'
end
end