在 Rails 4 中的索引页上实例化新对象

Instantiate new object on index page in Rails 4

简单的问题,我无法解决一些问题。

我正在尝试模仿这个 Railscast Episode 的前几个步骤。我有一个 picture-Model,我正在尝试在索引页上实例化此类对象。因此,我正在使用这些行:

index.erb.html

<%= form_for Picture.new do |f| %>
    <%= f.label :image, "Upload" %>
    <%= f.file_field :image, multiple: true %>
<% end %>

但是我收到这个错误:

undefined method `pictures_path' for #<#<Class:0xb465af0>:0x58fc488>

如果我删除表格,它会完美运行。看起来很简单,但我无法解决。我将不胜感激。

图片控制器

class PicturesController < ApplicationController
  respond_to :html

  def index
    @house = House.find(params[:house_id])
    @pictures = @house.pictures
    respond_with(@pictures)
  end

  def new
    @picture = Picture.new
  end

  def create
  end

  def destroy
  end

  private

  def picture_params
    params.require(:picture).permit(:id, :name, :house_id, :image, :_destroy)
  end

routes.rb

Rails.application.routes.draw do

  resources :houses do
      resources :pictures, only: [:index]
  end
end

您的 pictures 资源嵌套在您的 houses 资源中。没有路由允许你在没有 House 的情况下创建新的 Picture 来提供周围的上下文,因此 form_for 不能自动生成 URL 如果你给它 Picture.new.

你需要给它房子和照片。

通常,您会这样做:

form_for [@house, @house.pictures.new] do |f|

根据您给定的路线信息,您实际上并没有 pictures_path。您只有这些路线(如果您执行 rake routes):

house_pictures GET    /houses/:house_id/pictures(.:format) pictures#index
        houses GET    /houses(.:format)                    houses#index

这就是您收到该错误的原因。

您可以访问 house_pictures_path 但不能访问 pictures_path

要解决此问题,您必须使用 house_pictures_path 并将 @house@pictures 作为参数发送给它。像这样:

<%= form_for [@house, @house.pictures.build] do |f| %>
    <%= f.label :image, "Upload" %>
    <%= f.file_field :image, multiple: true %>
<% end %>