我希望有人能给我一些关于嵌套资源的见解,更具体地说是如何将它与CarrierWave联系起来。
我收到错误undefined method 'photos_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部分
<%= 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 %>
我的照片模型
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 Animal < ActiveRecord::Base
include ActiveModel::ForbiddenAttributesProtection
has_many :photos
scope :dog, where(name: "Dog")
def to_param
permalink.parameterize
end
end
我的PhotoController
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
谢谢你看看。非常感谢任何帮助。
答案 0 :(得分:1)
我对您的代码进行了一些调整。
注意我已经为动物添加了“s”
root to: "home#index"
resources :animals do
resources :photos
end
注意我已经从动物身上删除了一个“s”。我已将animal_permalink更改为id,因为这是嵌套资源所期望的默认值。另请注意,在照片控制器的新方法中,您检查“id”参数,而不是animal_permalink参数。
new_animal_photo_path(id: "dog")
在你的_form中。设置animal_permalink的值
<%= f.hidden_field :animal_permalink, value: @animal.permalink %>
这假设Photo将能够识别animal_permalink属性,并且您已经定义了animal.permalink方法/属性。我不熟悉固定链接的方法,所以你可能不得不捏一下,但这应该引导你朝着正确的方向(我通常设置:dog_id /:animal_id属性)。
让我知道这是怎么回事。