【问题标题】:Rails routing - First argument in form cannot contain nil or be emptyRails 路由 - 表单中的第一个参数不能包含 nil 或为空
【发布时间】: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


【解决方案1】:

你应该在控制器中初始化@course变量

@course = @listing.courses.build

但您似乎在上传文件时出错了。也许您应该使用nested form 创建/编辑课程并上传文件。或者考虑上传多个文件(更难的方式)。

【讨论】:

  • 或在@course 旁边发送图像[],在控制器中允许强属性“图像”,然后在 Course.create params[:images].each do |image| Course_photos.create(file: image,attachment, id: @course.id) end 之后像这样
  • 感谢您的回复,我可能做错了太多事情,所以我决定稍后尝试一种完全不同的方法。一旦我解决了这个问题,将保持更新
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多