Rails: Можете ли вы передать аргументы методу after_create? - PullRequest
6 голосов
/ 10 февраля 2010

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

Я надеюсь использовать метод обратного вызова after_create для назначения роли пользователю. Как получить доступ к выбранному значению поля выбора в методе after_create?

  def create
    @user = User.new(params[:user])

    respond_to do |format|
      if @user.save
        flash[:notice] = 'User creation successful.'
        format.html { redirect_to @user }
      else
        format.html { render :action => 'new' }
      end
    end
  end

В модели пользователя у меня есть:

  after_create :assign_roles

  def assign_roles
    self.has_role! 'owner', self
    # self.has_role! params[:role]
  end

Я получаю сообщение об ошибке, потому что модель не знает, какова роль.

Ответы [ 2 ]

14 голосов
/ 10 февраля 2010

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

4 голосов
/ 10 февраля 2010

Краткий ответ: нет. Вы не можете передавать аргументы в after_create.

Однако то, что вы пытаетесь сделать, довольно распространено, и есть и другие способы обойти это.

Большинство из них включают назначение отношений до создания рассматриваемого объекта, и позволяют ActiveRecord позаботиться обо всем.

Самый простой способ сделать это зависит от отношений между Ролями и Пользователями. Если это один ко многим (у каждого пользователя есть одна роль), пусть ваши пользователи принадлежат к роли и отправят role_id через форму.

 <%= f.collection_select :role_id, Role.all, :id, :name %>

Если между пользователями и ролями существует много-много отношений, вы достигаете того же, назначая @ user.role_ids

<%= f.collection_select :role_ids, Role,all, :id, :name, {},  :multiple => :true %>

Контроллер в любом случае выглядит как

def create   
  @user = User.new(params[:user])

  respond_to do |format|
    if @user.save
      flash[:notice] = 'User creation successful.'
      format.html { redirect_to @user }
    else
      format.html { render :action => 'new' }
    end
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...