Ruby on Rails - nil:NilClass 的未定义方法 'pods'



我是开发新手,也是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

最新更新