嵌套路由 - 损坏的形式,NoMethodError - 未定义的方法
Nested Routes - Broken Form, NoMethodError - undefined method
为了学习 Rails,我正在开发一个简单的日历应用程序。首先,我创建了两个脚手架和正确的 associations/routes:
- 日历
- content_items
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_controller 的 create 操作更改为:
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.
上阅读更多内容
为了学习 Rails,我正在开发一个简单的日历应用程序。首先,我创建了两个脚手架和正确的 associations/routes:
- 日历
- content_items
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_controller 的 create 操作更改为:
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.
上阅读更多内容