0

リソースをネストする方法、具体的にはそれを CarrierWave と結び付ける方法について、誰かが私に洞察を与えてくれることを期待していました。

エラーが発生undefined method 'photos_path'し、これを機能させる方法について少し行き詰まっています。

次のURLを取得できるようにしたい

新しい写真を作成する

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

私のフォトコントローラー

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

ご覧いただきありがとうございます。どんな助けでも大歓迎です。

4

1 に答える 1

1

コードにいくつかの調整を加えました。

animal に「s」を追加したことに注意してください

root to: "home#index"

resources :animals do
  resources :photos
end

動物から「s」を削除したことに注意してください。animal_permalink を id に変更しました。これは、ネストされたリソースによって期待されるデフォルトであるためです。また、写真コントローラーの新しいメソッドでは、animal_permalink パラメーターではなく、「id」パラメーターをチェックすることに注意してください。

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 属性を設定します)。

それがどうなるか教えてください。

于 2013-05-26T00:47:54.310 に答える