【发布时间】:2018-04-13 16:46:48
【问题描述】:
我有一个带有列表模型的 Rails 应用程序,其中包含_many Courses,其中包含_many Course_photos。
加载新 course_photos 的 rails route 是 "listing_course_photos" 或 /listings/:listing_id/courses/:id/course_photos(.:format)
在尝试加载此表单以上传 course_photos 时,我收到以下错误...
错误
ArgumentError in Listings#courses
Showing /Users/Jack_R/code/rails/planet_study/app/views/courses/_photo_upload.html.erb where line #1 raised:
First argument in form cannot contain nil or be empty
路由嵌套如下:
resources :listings, except: [:edit] do
member do
*****
end
resources :courses, except: [:edit] do
#delete :destroy, on: :collection
member do
******
resources :course_photos, only: [:create, :destroy]
end
end
end
我正在从部分视图/课程/_photo_upload.html.erb 上传照片:
<%= form_for @course, url: listing_course_photos_path([@listing, @course]), method: 'post', html: {multipart: true} do |f| %>
<div class="row">
<div class="form-group">
<span class="btn btn-default btn-file text-babu">
Select Photos
<%= file_field_tag "images[]", type: :file, multiple: true %>
</span>
</div>
</div>
<div class="text-center">
<%= f.submit "Add Photos", class: "btn btn-form" %>
</div>
<% end %>
<br/>
<div id="course_photos"><%= render 'course_photos/course_photos_list' %></div>
这反过来又呈现了这个部分:
<% if @course_photos.count > 0 %>
<br/>
<div class="row">
<% @course_photos.each do |photo| %>
<div class="col-md-4">
<div class="panel panel-default">
<div class="panel-heading preview">
<%= image_tag photo.image.url %>
</div>
</div>
<% end %>
</div>
</div>
<% end %>
Course_Photos 控制器
class CoursePhotosController < ApplicationController
before_action :set_listing
before_action :set_course, except: [:index, :new, :create]
def create
@listing = Listing.find(params[:listing_id])
@course = Course.find(params[:course_id])
@listing.course = listing.course
if params[:images]
params[:images].each do |img|
@course.course_photos.create[image: img]
end
@photos = @course.course_photos
redirect_back(fallback_location: request.referer, notice: "Saved...")
end
end
private
def set_course
@listing = Listing.find(params[:listing_id])
@course = Course.find(params[:id])
end
def set_listing
@listing = Listing.find(params[:listing_id])
end
end
任何建议将不胜感激
【问题讨论】:
-
你应该用
@listing.courses.new或类似的东西初始化@course变量 -
谢谢@PetrBalaban 我试过这个:“listing_course_photos_path([@listing, @listing.courses.new])”如果这就是你的意思?我得到了同样的错误
-
您需要使用
@listing.courses.new作为form_for中的第一个参数。但我建议你把这个作业提取到Listings#courses -
感谢您的回复,我可能做错了太多事情,所以我决定稍后尝试一种完全不同的方法。一旦我解决了这个问题,将保持更新
标签: ruby-on-rails partials nested-routes