嵌套路由 - 损坏的形式,NoMethodError - 未定义的方法

Nested Routes - Broken Form, NoMethodError - undefined method

为了学习 Rails,我正在开发一个简单的日历应用程序。首先,我创建了两个脚手架和正确的 associations/routes:

app/models/calendar.rb

class Calendar < ActiveRecord::Base
   has_many :content_items
end

app/models/content_item.rb

class ContentItem < ActiveRecord::Base
  belongs_to :calendar
end

routes.rb

resources :calendars do
  resources :content_items
end

controllers/content_items_controller.rb

 def create
   @content_item = ContentItem.new(content_item_params)
   @calendar = Calendar.find(params[:calendar_id] )
   respond_to do |format|
     if @content_item.save
       format.html { redirect_to calendar_content_item_path(@calendar,@content_item), notice: 'Content item was successfully created.' }
       format.json { render :show, status: :created, location: @content_item }
     else
       format.html { render :new }
       format.json { render json: @content_item.errors, status: :unprocessable_entity }
     end
   end
 end

当我创建嵌套路由时,我在尝试创建新 content_items 时开始 运行 出错。每当我提交表单时,我都会收到此错误:

NoMethodError in ContentItems#create
undefined method `content_items_path'

错误来自: views/content_items/index.html.erb

<%= form_for [@calendar, @content_item] do |f| %>

更新 使用@Gaurav GuptA 在下面发布的代码修复了表单问题,但导致了新的错误。每当我访问 /calendars/1/content_items 时,我都会收到一个错误 - 但仅在创建条目之后。使用空数据库,它工作正常。

ActionController::UrlGenerationError No route matches {:action=>"show", :calendar_id=>#, :controller=>"content_items", :format=>nil, :id=>nil} missing required keys: [:id]

我认为这是因为 content_item 在没有 calendar_id 的情况下被保存。如何设置 content_item 与它所属的 calendar_id 一起保存?

更新 2 它现在用 calendar_id 保存,但是当保存一个项目时,edit/shpw/destroy 的 link 抛出错误。

No route matches {:action=>"show", :calendar_id=>#<ContentItem id: 1, , content_type: "Test", content_text: "Tetst\r\n", calendar_id: 1, created_at: "2015-05-26 07:06:42", updated_at: "2015-05-26 07:06:42", content_image_file_name: nil, content_image_content_type: nil, content_image_file_size: nil, content_image_updated_at: nil>, :controller=>"content_items", :format=>nil, :id=>nil} missing required keys: [:id]

突出显示文件的这一部分:

<td><%= link_to 'Show', calendar_content_item_path(content_item) %></td>

GitHub link: https://github.com/JeremyEnglert/baked

尝试将 content_items_controllercreate 操作更改为:

 def create
   @calendar = Calendar.find(params[:calendar_id] )
   @content_item = @calendar.content_items.new(content_item_params) #Edit

   respond_to do |format|
     if @content_item.save
       format.html { redirect_to calendar_content_item_path(@calendar,@content_item), notice: 'Content item was successfully created.' }
       format.json { render :show, status: :created, location: @content_item }
     else
       format.html { render :new }
       format.json { render json: @content_item.errors, status: :unprocessable_entity }
     end
   end
 end

希望这对你有用。

好的,你的路线是这样的:

resources :calendars do
  resources :content_items
end

你得到这样的路径,例如:

/calendars/50
/calendars/50/content_items/77

然后路由到:

app/controllers/calendars_controller.rb
app/controllers/content_items_controller.rb

您的错误来自您在 ContentItemsController 中的 create 操作。您发布到操作的参数包括您的日历 ID "calendar_id"=>"1" 但那里没有任何东西可以接收它。 您需要获取与您正在创建的项目关联的日历实例。

@calendar = Calendar.find(params[:calendar_id] )

然后在您保存 @content_item 后传递给 calendar_content_item_path(如您的路线所示)两个对象:

format.html { redirect_to calendar_content_item_path(@calendar,@content_item), notice: 'Content item was successfully created.' }

在你的创建方法中 ContentItemsController 应该是这样的:

 def create
   @calendar = Calendar.find(params[:calendar_id] )
   @content_item = @calendar.content_items.build(params[:content])
   respond_to do |format|
     if @content_item.save
       format.html { redirect_to calendar_content_item_path(@calendar,@content_item), notice: 'Content item was successfully created.' }
       format.json { render :show, status: :created, location: @content_item }
     else
       format.html { render :new }
       format.json { render json: @content_item.errors, status: :unprocessable_entity }
     end
   end
 end

我还注意到您将日历 ID 传递给您的强参数。由于日历的 ID 不是由用户分配的,因此会出现错误。 您可以在 Strong Parameters.

上阅读更多内容