Ruby on rails Rails 3.2.13未定义的“照片路径”方法;使用带有CarrierWave的嵌套资源
我希望有人能给我一些关于如何嵌套资源的见解,更具体地说,如何将其与CarrierWave联系起来 我遇到了一个错误Ruby on rails Rails 3.2.13未定义的“照片路径”方法;使用带有CarrierWave的嵌套资源,ruby-on-rails,carrierwave,Ruby On Rails,Carrierwave,我希望有人能给我一些关于如何嵌套资源的见解,更具体地说,如何将其与CarrierWave联系起来 我遇到了一个错误未定义的方法“photos\u path”,我有点纠结于如何让它工作 我想能够有以下网址 创建一张新照片 site.com/animal/dog/photos/new 展示照片 site.com/animal/dog/photos/my-dog-in-the-park 我应该使用嵌套表单吗?非常感谢您的帮助 我的路线 root to: "home#index" resources
未定义的方法“photos\u path”
,我有点纠结于如何让它工作
我想能够有以下网址
创建一张新照片
site.com/animal/dog/photos/new
展示照片
site.com/animal/dog/photos/my-dog-in-the-park
我应该使用嵌套表单吗?非常感谢您的帮助
我的路线
root to: "home#index"
resources :animal do
resources :photos
end
我的家乡景色
<%= link_to "Add Dog Photo", new_animal_photo_path(animal_permalink: "dog") %>
我的表格不完整
<%= form_for [@animal, @photo], :html => {:multipart => true} do |f| %>
<%= f.hidden_field :animal_permalink %>
<p>
<%= f.label :title %><br />
<%= f.text_field :title %>
</p>
<p>
<%= f.file_field :image %>
</p>
<p>
</p>
<p><%= f.submit %></p>
<% end %>
{:multipart=>true}do | f |%>
我的照片模型
class Photo < ActiveRecord::Base
include ActiveModel::ForbiddenAttributesProtection
before_create :set_permalink
before_update :set_permalink
belongs_to :dog
mount_uploader :image, PhotoUploader
def set_permalink
self.permalink = title.parameterize
end
def to_param
permalink.parameterize
end
end
class-Photo
我的动物模型
class Animal < ActiveRecord::Base
include ActiveModel::ForbiddenAttributesProtection
has_many :photos
scope :dog, where(name: "Dog")
def to_param
permalink.parameterize
end
end
class Animal
我的光电控制器
class PhotosController < ApplicationController
def show
@photo = Photo.find(params[:id])
end
def new
@animal = Animal.find_by_permalink(params[:id])
@photo = Photo.new
end
def create
@photo = Photo.new(photo_params)
if @photo.save
flash[:notice] = "Successfully created photo."
redirect_to root_url
else
render :action => 'new'
end
end
def edit
@photo = Photo.find(params[:id])
end
def update
@photo = Photo.find(params[:id])
if @photo.update_attributes(photo_params)
flash[:notice] = "Successfully updated photo."
redirect_to root_url
else
render :action => 'edit'
end
end
def destroy
@photo = Photo.find(params[:id])
@photo.destroy
flash[:notice] = "Successfully destroyed photo."
redirect_to root_url
end
private
def photo_params
params.require(:photo).permit(:title, :image, :animal_id)
end
end
class photocontroller“新建”
结束
结束
定义编辑
@photo=photo.find(参数[:id])
结束
def更新
@photo=photo.find(参数[:id])
如果@photo.update_属性(photo_参数)
flash[:notice]=“已成功更新照片。”
将\u重定向到根\u url
其他的
呈现:操作=>“编辑”
结束
结束
def销毁
@photo=photo.find(参数[:id])
@照片。销毁
flash[:notice]=“已成功销毁照片。”
将\u重定向到根\u url
结束
私有的
def照片参数
参数要求(:照片)。许可证(:标题,:图像,:动物id)
结束
结束
谢谢你看。非常感谢您的帮助。我对您的代码做了一些调整 请注意,我在animal中添加了一个“s”
root to: "home#index"
resources :animals do
resources :photos
end
注意,我已经从动物身上删除了一个“s”。我已将animal_permalink更改为id,因为这是嵌套资源所期望的默认值。另外,请注意,在photos controller的新方法中,您检查的是“id”参数,而不是animal_permalink参数
new_animal_photo_path(id: "dog")
以你的形式。设置动物\u permalink的值
<%= f.hidden_field :animal_permalink, value: @animal.permalink %>
这假设Photo能够识别animal_permalink属性,并且您已经定义了animal.permalink方法/属性。我不熟悉permalink方法,因此您可能需要稍微调整一下,但这应该会引导您朝着正确的方向前进(我通常会设置:dog\u id/:animal\u id属性)
让我知道这是怎么回事。错误看起来像是在抱怨路线问题。@animal object能否在/animal/dog/photos/new上为零?嗨,斯沃兹,谢谢你的回复。我来看看。我想这也可能是因为在新控制器中没有将动物id传递给@photo。似乎缺少了一些重要的东西。。。您何时收到错误?你能贴出错误的痕迹吗?看起来您在代码中的某个地方调用了一个尚未定义的路径。嘿,cgat!谢谢这接近于我目前的工作解决方案。在新操作中,我创建了一个实例变量@photo=@animal.photos.build(animal\u id:@animal\u id)。在一个动作中有两个实例变量可以吗?或者我应该考虑重构吗?在一个动作中有两个实例变量可以。你以前的新动作很好。通过使用animal\u id构建@photo,您所做的就是允许表单访问@photo.animal\u id,但您已经可以通过@animal访问该值。您的表单将为新对象设置参数,因此如果您想创建一张带有animal_id:@animal.id的照片,您必须在表单中包含一个隐藏字段(当然,您似乎使用了permalink)。还要注意
@animal.photos.build(animal\u id:@animal\u id)
等于@animal.photos.build