При создании объекта в Ruby on Rails какой метод сохранения вы предпочитаете и почему? - PullRequest
7 голосов
/ 07 апреля 2009

При написании метода create для объекта в приложении Ruby on Rails я использовал два метода. Я хотел бы использовать один метод для более чистого и последовательного кода. Я перечислю два метода ниже. Кто-нибудь знает, лучше ли один, чем другой? Если так, то почему?

Метод 1:

def create1
  # is this unsecure? should we grab user_id from the session
  params[:venue]['user_id'] = params[:user_id]

  begin
    venue = Venue.create(params[:venue])
    @user_venues = @user.venues
    render :partial => 'venue_select_box', :success => true, :status => :ok
  rescue ActiveRecord::RecordInvalid
    render :text => 'Put errors in here', :success => false, :status => :unprocessable_entity
  end
end

Метод 2:

def create2
   # is this unsecure? should we grab user_id from the session
  params[:venue]['user_id'] = params[:user_id]

  venue = Venue.new(params[:venue])
  if venue.save
    @user_venues = @user.venues
    render :partial => 'venue_select_box', :success => true, :status => :ok
  else
    render :text => 'Put errors in here', :success => false, :status => :unprocessable_entity
  end
end

Ответы [ 4 ]

4 голосов
/ 07 апреля 2009
class VenuesController < ApplicationController
  def create
    @venue = @user.venues.create!(params[:venue])
    render :partial => 'venue_select_box', :success => true, :status => :ok
  end

  rescue_from ActiveRecord::RecordInvalid do
    render :text => 'Put errors in here', :success => false, :status => :unprocessable_entity
  end
end

Используя @user.venues таким образом, убедитесь, что идентификатор пользователя всегда будет установлен соответствующим образом. Кроме того, ActiveRecord защитит поле :user_id от назначения во время вызова #create!. Следовательно, атаки извне не смогут изменить :user_id.

В ваших тестах вы можете проверить, что выполнение POST для: создает вызов исключения ActiveRecord :: RecordInvalid.

3 голосов
/ 07 апреля 2009

Я из школы мысли, что исключения не должны использоваться для рутинных условий, поэтому я бы сказал, что второе лучше.

2 голосов
/ 07 апреля 2009

Это зависит. Если вы ожидаете, что все операторы create будут работать, используйте первый, потому что ошибка create-and-save является исключительной и может быть условием, из-за которого программа не может быть легко восстановлена. Кроме того, если вы используете реляционную целостность (foreign_key_migrations от RedHill Consulting), это приведет к исключениям при нарушениях внешнего ключа, поэтому вы, вероятно, захотите отлавливать их при создании или обновлении.

Второе является работоспособным, и хорошо, если запрос не выполняется, что вы ожидаете как часть повседневной операции этого конкретного действия.

Кроме того, ваш комментарий к коду о том, что сессия небезопасна - сессия - это место для добавления user_id. Пока вы проверяете, что пользователь прошел аутентификацию, прежде чем делать что-либо еще, вы будете в порядке.

1 голос
/ 07 апреля 2009

Я полностью согласен с комментарием Дона. Но я бы даже пошел еще дальше с партией user_id и установил бы ее в качестве фильтра перед моделью.

...