Как запретить Rails создавать пустые строки в post

#ruby-on-rails #ruby #ruby-on-rails-4

#ruby-on-rails #ruby #ruby-on-rails-4

Вопрос:

У меня есть миграция:

 class CreateCourses < ActiveRecord::Migration
  def change
    create_table :courses, :id => false do |t|
      t.uuid :id, :primary_key => true, :null => false
      t.datetime :date_start, :null => false
      t.float :price, :null => false
      t.datetime :date_end
      t.text :description
      t.text :location, :null => false
      t.timestamps
    end
  end
end
  

И у меня есть свой create метод в моем контроллере:

 def create
  course  = Course.new(params[:course])
  if course.save
    render :nothing => true
  else
    render "public/422", :status => 422
    return
  end 
end
  

Прямо сейчас, когда я вызываю свой create метод с любыми данными, он создает новую пустую строку в моей Course таблице. Однако я хочу убедиться, что объект, который отправляется для создания, на самом деле является объектом курса, и что местоположение и цена (например) не являются пустыми и существуют.

У меня есть ASP.NET Опыт работы с MVC, так что я только начинаю изучать Rails.

P.S как мне вернуть ответ success 200 при успешном создании, вместо render :nothing => true ?

Комментарии:

1. Как выглядит ваша модель курса? У вас есть какие-либо проверки? Смотрите: guides.rubyonrails.org/active_record_validations.html

Ответ №1:

Проверьте проверки модели:

http://guides.rubyonrails.org/active_record_validations.html#validates-associated

но в качестве примера:

 class Library < ActiveRecord::Base
  has_many :books
  validates_associated :books
end
  

Ответ №2:

Как правило, вы хотели бы поместить проверку в модель, чтобы убедиться, что вы не создаете недопустимые записи, такие как:

 class Course < ActiveRecord::Base
  ...
  validates :location, :price, presence: true
  ...
  

Что касается возврата успешного ответа, то, что вы, вероятно, хотите сделать, это перенаправить на show страницу после завершения обработки, например:

 def update
  respond_to do |format|
    if @course.save
      format.html { redirect_to @course, notice: 'Course was successfully created.' }
    end
  end
end
  

Также неплохо запустить код, чтобы получить ваш объект в методе вашего контроллера, что означает меньшее дублирование кода!:

 class CourseController < ApplicationController
  before_action :set_course
  ...

  def set_course
    @course = Course.find(params[:id])
  end
  ...
  

Комментарии:

1. Я работаю с AngularJS в качестве интерфейса, поэтому мне «нужно» вернуть успешный ответ

2. Согласно: shellycloud.com/blog/2013/10 / … похоже, вы должны сделать render nothing: true, status: 200 , кстати, в наши дни писать намного приятнее render nothing: true , чем render :nothing => true лично я думаю, что это читается намного лучше