#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
лично я думаю, что это читается намного лучше