2015-10-09 2 views
1

простой вопрос, который я не могу решить.Создайте новый объект на индексной странице в Rails 4

Я пытаюсь имитировать первые несколько шагов этого Railscast Episode. У меня есть picture -Model, и я пытаюсь создать экземпляр объекта такого типа на индексной странице. Therefor Я использую эти строки:

index.erb.html

<%= form_for Picture.new do |f| %> 
    <%= f.label :image, "Upload" %> 
    <%= f.file_field :image, multiple: true %> 
<% end %> 

Но я получаю эту ошибку:

undefined method `pictures_path' for #<#<Class:0xb465af0>:0x58fc488> 

Если удалить форму, которую она отлично работает. Кажется простым, но я не могу его решить. Я был бы признателен за помощь.

PicturesController

class PicturesController < ApplicationController 
    respond_to :html 

    def index 
    @house = House.find(params[:house_id]) 
    @pictures = @house.pictures 
    respond_with(@pictures) 
    end 

    def new 
    @picture = Picture.new 
    end 

    def create 
    end 

    def destroy 
    end 

    private 

    def picture_params 
    params.require(:picture).permit(:id, :name, :house_id, :image, :_destroy) 
    end 

routes.rb

Rails.application.routes.draw do 

    resources :houses do 
     resources :pictures, only: [:index] 
    end 
end 
+0

Вы бы описали свой код: 'index.html.erb'? –

+0

Также ваши маршруты.rb, пожалуйста. – Doon

+0

Это на самом деле и там, и, возможно, в плохом формате. Я исправлю это. – Syk

ответ

1

С вашей данной информации маршрутов, вы на самом деле не pictures_path. У вас есть только эти маршруты (если вы делаете rake routes):

house_pictures GET /houses/:house_id/pictures(.:format) pictures#index 
     houses GET /houses(.:format)     houses#index 

Вот почему вы получаете эту ошибку.

У вас есть доступ к house_pictures_path НО НО pictures_path.

Чтобы решить эту проблему, вы должны использовать house_pictures_path и отправить @house и @pictures в качестве аргумента. что-то вроде этого:

<%= form_for [@house, @house.pictures.build] do |f| %> 
    <%= f.label :image, "Upload" %> 
    <%= f.file_field :image, multiple: true %> 
<% end %> 
+1

Да, это конечно: D Спасибо, что снова открыли мне глаза. Хотя это должно быть '@ house.pictures.build' с момента его ассоциации« один-ко-многим ». Если вы измените это в своем ответе, я с удовольствием принимаю его как решающий ответ. – Syk

+0

Я обновил свой ответ. Но, вы попробовали '@ house.pictures.new' на самом деле? это тоже должно работать, поскольку у него есть ассоциация 'has_many' с изображением, поэтому' @ house.pictures.new' и '@ house.pictures.build' должны иметь тот же эффект. См. Это для справки: https://github.com/rails/rails/blob/master/activerecord/lib/active_record/relation.rb#L124 –

+0

Да, вы правы. Вы написали '@ house.picture.новый' в вашем первом ответе, но я должен был видеть, что недостающие «s» были проблемой, а не методом. Таким образом, оба будут правильнее, чем его множественное число. Спасибо за вашу помощь. – Syk

0

Ваш pictures ресурс вложен в пределах вашего houses ресурса. Нет пути, позволяющего создать новый Picture без House, чтобы обеспечить окружающий контекст, и поэтому form_for не может автоматически создавать URL-адрес, если вы его даете только Picture.new.

Вам необходимо предоставить как дом, так и фотографию.

Как правило, ваш будет делать что-то вроде этого:

form_for [@house, @house.pictures.new] do |f| 
Смежные вопросы