私は開発と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
作成 '