Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 嵌套路由-断开形式,命名错误-未定义方法_Ruby On Rails_Ruby_Associations_Nested Routes - Fatal编程技术网

Ruby on rails 嵌套路由-断开形式,命名错误-未定义方法

Ruby on rails 嵌套路由-断开形式,命名错误-未定义方法,ruby-on-rails,ruby,associations,nested-routes,Ruby On Rails,Ruby,Associations,Nested Routes,为了学习Rails,我正在开发一个简单的日历应用程序。首先,我创建了两个脚手架和适当的关联/路线: 日历 内容和项目 app/models/calendar.rb class Calendar < ActiveRecord::Base has_many :content_items end class ContentItem < ActiveRecord::Base belongs_to :calendar end resources :calendars do

为了学习Rails,我正在开发一个简单的日历应用程序。首先,我创建了两个脚手架和适当的关联/路线:

  • 日历
  • 内容和项目
app/models/calendar.rb

class Calendar < ActiveRecord::Base
   has_many :content_items
end
class ContentItem < ActiveRecord::Base
  belongs_to :calendar
end
resources :calendars do
  resources :content_items
end
 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
<%= form_for [@calendar, @content_item] do |f| %>
controllers/content\u items\u controller.rb

class Calendar < ActiveRecord::Base
   has_many :content_items
end
class ContentItem < ActiveRecord::Base
  belongs_to :calendar
end
resources :calendars do
  resources :content_items
end
 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
<%= form_for [@calendar, @content_item] do |f| %>
当我创建嵌套路由时,我在尝试创建新内容项时开始出错。无论何时提交表单,都会出现以下错误:

ContentItems中的命名错误#创建
未定义的方法'content\u items\u path'

错误来自: 视图/content\u items/index.html.erb

class Calendar < ActiveRecord::Base
   has_many :content_items
end
class ContentItem < ActiveRecord::Base
  belongs_to :calendar
end
resources :calendars do
  resources :content_items
end
 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
<%= form_for [@calendar, @content_item] do |f| %>

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

ActionController::UrlGenerationError 没有路由匹配{:action=>“show”,:calendar_id=>#,:controller=>“content_items”,:format=>nil,:id=>nil}缺少必需的键:[:id]

我相信这是因为保存内容项时没有日历id。如何设置内容项以其所属的日历id保存

更新2 它现在使用日历id保存,但保存项目时,编辑/shpw/destroy的链接会抛出错误

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]
没有路由匹配{:action=>“show”,:calendar\u id=>,:controller=>“content\u items”,:format=>nil,:id=>nil}缺少必需的键:[:id]
它突出显示了文件的这一部分:

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


GitHub链接:

尝试将您的创建内容项目\u控制器的操作更改为:

 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

希望这对您有用。

尝试将您的创建内容项目控制器的操作更改为:

 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\u id”=>“1”
但是没有什么东西可以接受它。 您需要获取与正在创建的项目关联的日历实例

@calendar = Calendar.find(params[:calendar_id] )
然后在保存
@content\u item
后,将两个对象传递到日历\u content\u item\u路径(如路由中所示):

format.html { redirect_to calendar_content_item_path(@calendar,@content_item), notice: 'Content item was successfully created.' }
ContentItemsController中的create方法中,应如下所示:

 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,因此可能会出现错误。
您可以在上阅读更多信息。

好的,关于您拥有的路线:

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\u id”=>“1”
但是没有什么东西可以接受它。 您需要获取与正在创建的项目关联的日历实例

@calendar = Calendar.find(params[:calendar_id] )
然后在保存
@content\u item
后,将两个对象传递到日历\u content\u item\u路径(如路由中所示):

format.html { redirect_to calendar_content_item_path(@calendar,@content_item), notice: 'Content item was successfully created.' }
ContentItemsController中的create方法中,应如下所示:

 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,因此可能会出现错误。
您可以阅读更多信息。

我认为问题在于“format.html{redirect_to@content_item,注意:'content item已成功创建”。”您可以更新您的问题,将
ContentItems\create
的代码和
rake routes
的输出包含在上面的终端更新问题中。将此更改为:我认为问题在这一行“format.html{redirect_to@content_item,注意:'content item已成功创建”。}”您可以更新您的问题,将
ContentItems\create
的代码和
rake routes
的输出包含在上面的终端更新问题中。将此更改为:Awesome-这解决了表单问题-非常感谢!我认为表单保存时没有日历id,这会导致保存内容后出现另一个错误。我更新了上面的问题。您的显示操作路径必须是“/calendars/:calendar\u id/content\u items/:id”,如“/calendars/1/content\u items/23”@GauravGupta,您没有保存关联,因此
@content\u item
calendar\u id为零。相反,
@content\u item=@calendar.content\u items.build(params[:content])
Awesome-这解决了表单问题-非常感谢!我认为表单保存时没有日历id,这会导致保存内容后出现另一个错误。我更新了上面的问题。您的显示操作路径必须是“/calendars/:calendar\u id/content\u items/:id”,如“/calendars/1/content\u items/23”@GauravGupta,您没有保存关联,因此
@content\u item
calendar\u id为零。相反,
@content\u item=@calendar.content\u items.build(params[:content])
在我保存一个项目之前,这非常有效。这些项目似乎是在没有日历id的情况下保存的,因此我在尝试查看/calendars/1/content\u项目时出错。我用保存一个项目后出现的新错误更新了原始问题。在保存一个项目之前,这非常有效。这些项目似乎是在没有日历id的情况下保存的,因此我在尝试查看/calendars/1/content\u项目时出错。我用保存项目后出现的新错误更新了原始问题。