2014-07-24 2 views
1

Я пытаюсь загрузить фотографию, но после того, как я нажму кнопку загрузки, я получаю эту ошибку. Я новичок в rails 4, поэтому я не уверен, что мне не хватает.соответствует POST route rails 4

Моя логика - это когда я нажимаю кнопку отправки. Это вызовет действие create для запуска и создания объекта IncomePicture и сохранит его в моей базе данных.

No route matches [POST] "/income_pictures/new" 

Маршруты:

root_path     GET /         static_pages#home 
income_pictures_path  GET  /income_pictures(.:format)   income_pictures#index 
          POST  /income_pictures(.:format)   income_pictures#create 
new_income_picture_path  GET  /income_pictures/new(.:format)  income_pictures#new 
edit_income_picture_path GET  /income_pictures/:id/edit(.:format) income_pictures#edit 
income_picture_path   GET  /income_pictures/:id(.:format)  income_pictures#show 
          PATCH /income_pictures/:id(.:format)  income_pictures#update 
          PUT  /income_pictures/:id(.:format)  income_pictures#update 
          DELETE /income_pictures/:id(.:format)  income_pictures#destroy 

Контроллер:

class IncomePicturesController < ApplicationController 
    def new 
    @income_picture = IncomePicture.new 
    end 

    def create 
    @income_picture = IncomePicture.new(IncomePicture_params) 
    if @income_picture.save 
     flash[:notice] = "Income picture successfully uploaded" 
     redirect_to @income_picture 
    end 
    end 

    def show 
    @income_picture = IncomePicture.find(params[:id]) 
    end 

    def index 
    @income_picture = IncomePicture.all 
    end 

    private 
    def IncomePicture_params 
     params.require(:income_picture).permit(:image, :name) 
    end 
end 

Вид:

<%= form_for :income_picture, :html => { :multipart => true } do |f| %> 
    <p> 
     <%= f.label :name %> 
     <%= f.text_field :name %> 
    </p> 
    <p> 
     <%= f.label :image %> 
     <%= f.file_field :image %> 
    </p> 
    <p><%= f.submit %></p> 
<% end %> 
+0

Вам необходимо ввести строчный код в свой метод IncomPicture_params. Ruby чувствителен к регистру, а метод рельсов для записи метода является строчным. Начиная с прописной буквы указывает константу. – ABMagil

ответ

2

Я думаю, что вы хотите, а не form_for @income_pictureform_for :income_picture.

От the form guide: Использование символа создает форму для new_income_picture_path, то есть/income_picture/new, тогда как использование заполненной переменной экземпляра создает форму tocome_pictures_path, то есть доход/изображения. Оба устанавливают метод формы POST. Однако нет такого маршрута, как POSTing to/income_picture/new /, что и вызвало ошибку.

1

form_for

Выработать о принятом ответ, вы должны помнить, что при вызове form_for, Rails делает некоторые довольно удивительные вещи:

  1. Он принимает ActiveRecord объект и строит «маршрут» из него (из модели)
  2. Он заполняет форму данными объекта ActiveRecord
  3. Это позволяет сохранять воспринимаемое постоянное состояние на форме (консервации данные)

Проблемы вы имеете, вы передаете простой symbol формы - что предотвращает Rails от того, для точного доступа к данным, необходимым для совершения 3 «магических» шагов выше возможных.

Это означает, что вы получите случайные ошибки, как тот, что вы видите (IE при отсутствии объекта ActiveRecord, Rails будет просто использовать один и тот же URL, что у вас есть на странице - /new)

- -

ActiveRecord

способ устранения проблемы у вас есть, чтобы заменить symbol с ActiveRecord object, который был предложен в принятом ответе.

Причина, почему с помощью ActiveRecord object (@instance_variable) работает из-за основные функции Ruby «s - это объекта ориентированного язык.Будучи объектом ориентированы, то это означает, что каждый раз, когда вы населён ActiveRecord объект, вы будете в основном дают Rails серию другой информации, такие как model_name и т.д.

Это означает, что когда вы передаете @instance_variable к form_for метод, Rails смогут принимать данные из ActiveRecord & обрабатывать его на экране для вас