Rails 3.2.13未定义的方法`photos_path',带有CarrierWave的嵌套资源

时间:2013-05-20 04:44:59

标签: ruby-on-rails carrierwave

我希望有人能给我一些关于嵌套资源的见解,更具体地说是如何将它与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

谢谢你看看。非常感谢任何帮助。

1 个答案:

答案 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属性)。

让我知道这是怎么回事。