【问题标题】:Using form_for with nested resources. "Undefined method _index_path"将 form_for 与嵌套资源一起使用。 “未定义的方法_index_path”
【发布时间】:2014-12-14 22:30:42
【问题描述】:

我正在尝试使用 Carrierwave 在表单上上传文件。到目前为止,我已经设法将一个模型“嵌套”到另一个模型上,但现在我无法正确执行“form_for”。

这个想法是建立一个页面(索引),列出与每个人(Individuo)对应的照片(Fotografias),并能够在同一页面中添加新照片。

我有以下型号:

fotografia.rb

class Fotografia < ActiveRecord::Base
  belongs_to :individuo

  mount_uploader :title, ArchivoUploader
end

individuo.rb

class Individuo < ActiveRecord::Base
  has_many :fotografias
end

控制器:

fotografias_controller.rb

class FotografiasController < ApplicationController
  before_action :set_individuo, only: [:index, :show, :edit, :create, :update, :destroy]
  before_action :set_fotografia, only: [:show, :edit, :update, :destroy]

  def index
     @fotografias = @individuo.fotografias
     @new_foto = @individuo.fotografias.build
  end

  def set_individuo
    @individuo = Individuo.find(params[:individuo_id])
  end

  def set_fotografia
    @fotografias = Fotografia.find(params[:id])
  end

  def fotografia_params
    params.require(:individuo).permit(:individuo_id, :title)
  end
end

title 是保存模型中文件信息的字段。

index.html.haml:

=form_for [@individuo,@new_foto] do |f|
  .row
    =f.file_field :title, :class => 'hidden'
    =f.label :title, 'New Fotografia', :class => 'btn btn-sm btn-primary'

我读到这可能是一个多元化问题,但我认为情况并非如此。这些是我的路线:

routes.rb

  resources :individuos do
    resources :fotografias
  end

rake 路由输出:

    individuo_fotografias GET    /individuos/:individuo_id/fotografias(.:format)          fotografias#index
                          POST   /individuos/:individuo_id/fotografias(.:format)          fotografias#create
 new_individuo_fotografia GET    /individuos/:individuo_id/fotografias/new(.:format)      fotografias#new
edit_individuo_fotografia GET    /individuos/:individuo_id/fotografias/:id/edit(.:format) fotografias#edit
     individuo_fotografia GET    /individuos/:individuo_id/fotografias/:id(.:format)      fotografias#show
                          PATCH  /individuos/:individuo_id/fotografias/:id(.:format)      fotografias#update
                          PUT    /individuos/:individuo_id/fotografias/:id(.:format)      fotografias#update
                          DELETE /individuos/:individuo_id/fotografias/:id(.:format)      fotografias#destroy

对于西班牙语命名法和其他语言混淆,我深表歉意。

当我尝试加载 http://localhost:3000/individuos/3/fotografias 时,我收到以下错误:“# 的未定义方法 individuo_fotografia_index_path”,导致错误的行是 =form_for [@individuo,@new_foto] do |f|

我错过了什么的任何线索?

解决方案

根据 TK-421 的回答,我对 form_for 进行了此更改:

=form_for [@new_foto.individuo, @new_foto], :html => { :multipart => true }, :url => {:controller => 'fotografias', :action => 'create'} do |f|

这将确保它转到Fotografias 控制器中的 CREATE 操作。为了彻底起见,这里是控制器中的创建操作:

fotografias_controller.rb

def create
  @fotografia = @individuo.fotografias.new(fotografia_params)

  respond_to do |format|
    if @fotografia.save
      format.html { redirect_to individuo_fotografias_path, notice: 'Fotografias Actualizadas' }
    else
      format.html { render :new }
    end
  end
end

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4


    【解决方案1】:

    鉴于上述路由输出和错误,Rails 似乎正在寻找individuo_fotografias_path(而不是individuo_fotografia_index_path)。

    但根据您提供的 form_for 示例,我不确定这是否是您的意图。

    您可以尝试将url 参数添加到您的表单助手中以更具体:url: individuo_fotografias_path

    或者以其他方式尝试doc 中定义的帮助程序的一些较长形式的选项,直到你让它按照你想要的方式工作。

    【讨论】:

    • 我不太确定它是否必须降落。我目前正在尝试在将加载新图像的表单上放置一个按钮,以便可以将其保存到数据库中。 “保存”操作将在同一页面上(我认为),但该错误让我非常困惑,因为它在没有时要求“index_path”。
    • 顺便说一句,我试过你的建议,现在错误消失了,但我仍然不知道它是否真的有效。当我有结果时会测试和更新。
    • 小崽子,错误消失了,不需要再听了。拉拉拉拉拉。 ;)
    猜你喜欢
    • 2017-01-24
    • 2012-10-22
    • 2011-01-16
    • 1970-01-01
    • 2011-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多