0

私は開発とRailsに不慣れです。

プロジェクトとポッドの2つのリソースがあります。//ポッドはサブプロジェクトのようなものです

----- config / routers.rb ------

  resources :projects
  resources :pods

------ model / 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

------ model / 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

プロジェクトビューには、ポッドを作成するためのリンクがあります

<p> <%= link_to "Create new Pod", new_pod_path(project: @project.id) %></p>

ここでは、プロジェクトIDをnew_pod_pathに送信して、ポッドの作成時にこの特定のプロジェクトに関連付けることができるようにします。

------ポッドコントローラー------

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

======================

[新しいポッドの作成]リンクをクリックすると、フォームが表示され、デバッグパラメータに次のように表示されます。

project: '1'
action: new
controller: pods

詳細を入力して[送信]をクリックすると、次のエラーが発生します

NoMethodError in PodsController#create

undefined method `pods' for nil:NilClass

ここで何が起こっているのかわかりません。ポッドにはテストスイートがあり、テストスイートにはテストケースがあるため、現時点ではネストされたリソースは必要ありません。

どんな助けでも本当にありがたいです

=====================================編集----

何が悪いのかわかりません。もっとはっきりさせておきます。プロジェクトIDが----"のnew_pod_pathを持つプロジェクトショーページがあります

<%= link_to "Create new Pod"、new_pod_path(project_id:@ project.id)%>

"----------これはポッドコントローラーの新しいアクションに移動します。コードは-----です。

  def new
    @project = Project.find(params[:project_id])
    @pod = Pod.new
  end

新しいアクションでプロジェクトを見つける必要がありますか?

新しいのポッドビュー:

    <%= 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 ...

何が起こっているのかわかりません。たとえば、フロー(Project show page)を教えていただければ、引数にプロジェクトIDを指定してnew_pod_pathを呼び出します。新しいポッドアクションはそのIDを取得してプロジェクトを見つけるか、何らかの方法で新しいポッドフォームで利用できるようにします。新しいポッドフォームは、taht idを使用し、hidden_​​field ..として渡します。次に、createアクションは、paramsを介して隠しフィールドを取得し、プロジェクトを検索して、project.pods.build(...を作成します。

-------------サーバーログ-------------プロジェクトIDのみに問題があるようです----------POST"/podsを開始しました"for 127.0.0.1 at 2013-03-15 17:55:56 -0700 Processing by PodsController#create as HTML Parameters:{"utf8 "=>"✓"、" authenticity_token "=>" fXCOH0kUgHHVtrH79d4VCrHWJakdGQ8cKQmiJlE0OV4 = "、" pod " => {"project_id" => "1"、 "name" => "sdf"、 "description" => "df"}、 "commit" => "Create new pod"}ユーザー負荷(0.4ms)SELECT " users"。*FROM"users"WHERE"users"。"remember_token"= '70InmWq61iFCnjzuxhBP6g' LIMIT 1プロジェクトロード(0.2ms)SELECT"projects"。*FROM" projects"WHERE"projects"。"id "IS NULL LIMIT14msで500の内部サーバーエラーを完了しました

NoMethodError(未定義のメソッドpods' for nil:NilClass): app/controllers/pods_controller.rb:23:in作成 '

4

3 に答える 3

1

作成であなたは行方不明です

@project = Project.find(params[:project])

project_idがparamsキーにあることを確認してください:project

リクエストに応じて、ビュー変数@を再作成する必要があります。

編集:

paramsハッシュにproject_idをどのように配置していますか(project_id"=>{"1"=>""},)(そのIDを取得するにはparams[:project_id].first.key、それは醜いです)

あなたが提案されたcodeitが好きなら、

<%= hidden_field 'project', @project.id %> <!--@project initialized in new -->

またはあなたはすることができます

<%= hidden_field 'project', params[:project] %> <!--params[:project] coming from the new request -->

次にparams[:project]、ID1を提供します

于 2013-03-15T17:49:45.900 に答える
0

hidden_field_tagフォームでの使用new pod

<%= 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
于 2013-03-15T18:02:37.323 に答える
0

インスタンス変数@podはnilです。これは、メソッドが例外を発生させることを意味します。@podメソッドを使用する前に、何かで満たす必要があります

于 2013-03-15T20:14:18.770 に答える