【发布时间】: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