2015-09-22 12 views
5

Użycie listonosza do POST, aby utworzyć trochę JSON-a w DB, istnieje fragment kodu do przetestowania. Otrzymanie błędu, który mówi, że metoda "film" jest niezdefiniowana, ale ta metoda nigdy nie jest wywoływana.RoR - niezdefiniowana metoda "film" dla # <Film: 0x007fa43a0629e0>

{"movie": { 
    "title": "Its a Mad Mad Word", 
    "year": "1967", 
    "summary": "So many big stars" 
    } 
} 

Poniżej znajduje się kod, a błąd jest następujący:

undefined method 'movie' for #<Movie:0x007fcfbd99acc0>

Controller Application

class ApplicationController < ActionController::Base 
    protect_from_forgery with: :null_session 
end 

Controller

module API 
    class MoviesController < ApplicationController 
... 
     def create 
      movie = Movie.new({ 
       title: movie_params[:title].to_s, 
       year: movie_params[:year].to_i, 
       summary: movie_params[:summary].to_s 
      }) 
      if movie.save 
       render json: mov, status: 201 
      else 
       render json: mov.errors, status: 422 
      end 

     end 

     private 
     def movie_params 
      params.require(:movie).permit(:title, :year, :summary) 
     end 
    end 
end 

Modele

class Movie < ActiveRecord::Base 
    validates :movie, presence: true 
end 

Migracja

class CreateMovies < ActiveRecord::Migration 
    def change 
    create_table :movies do |t| 
     t.string :title 
     t.integer :year 
     t.text :summary 

     t.timestamps null: false 
    end 
    end 
end 

Trasy

Rails.application.routes.draw do 
    namespace :api do 
    resources :movies, only: [:index, :show, :create] 
    end 
end 
+0

nie był używany Rails jak API, ale ta walidacja w twoim modelu wydaje się podejrzana. –

+0

skoro jesteś początkującym, naprawdę muszę powiedzieć, kocham sposób, w jaki wygląda twoje pytanie! –

Odpowiedz

4

walidacji są wykorzystywane w celu zapewnienia, że ​​tylko ważne dane są zapisywane w bazie danych, więc należy sprawdzić poprawność pól film (tytuł, rok , podsumowanie)

validates :movie, presence: true 

go zmienić na:

validates :title, presence: true 
validates :year, presence: true 
validates :summary, presence: true 

Możesz uzyskać więcej informacji z here

/edit przez huanson można również Podsumowując:

validates :title, :year, :summary, presence: true