2

У меня есть приложение Rails 4 с использованием Devise для аутентификации - и в настоящее время он работает.Rails 4: как получить доступ к содержимому Devise Registrations Controller

Я теперь следую за этим учебным курсом coderwall о Creating a Scoped Invitation System for Rails.

В недавно приглашенного регистрации пользователя раздел , автор рекомендует udpate в RegistrationsController, следующим образом:

def new 
    @token = params[:invite_token] #<-- pulls the value from the url query string 
end 

def create 
    @newUser = build_user(user_params) 
    @newUser.save 
    @token = params[:invite_token] 
    if @token != nil 
    org = Invite.find_by_token(@token).user_group #find the user group attached to the invite 
    @newUser.user_groups.push(org) #add this user to the new user group as a member 
    else 
    # do normal registration things # 
    end 
end 

Есть много вопросов и ответов, на переполнение стека, а также accross Интернет, объясняя, как переопределить Завещание RegistrationsControllers, в том числе:

Итак, я понимаю, что создание MyDevise::RegistrationController что унаследует от Devise::RegistrationsController и вызова команды super в начале действия, которые я хочу изменить будет держать первоначальные функции этих действий.

я мог бы сделать что-то вроде:

def new 
    super 
    @token = params[:invite_token] #<-- pulls the value from the url query string 
end 

def create 
    @newUser = build_user(user_params) 
    @newUser.save 
    @token = params[:invite_token] 
    if @token != nil 
    org = Invite.find_by_token(@token).user_group #find the user group attached to the invite 
    @newUser.user_groups.push(org) #add this user to the new user group as a member 
    else 
    super 
    end 
end 

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

-----

UPDATE: Я знаю, что мы можем получить доступ к Devise::RegistrationsController из Devise GitHub repository, но я не уверен, что у меня это все та же. Это может быть, например, было изменено, когда я реализовал свою систему аутентификации.

-----

UPDATE 2: если я использую код из Devise::RegistrationsController упоминания в моем первом обновлении, я могу придумать следующий код для моего нового RegistrationsController:

def new 
    @token = params[:invite_token] #<-- pulls the value from the url query string 
    build_resource({}) 
    set_minimum_password_length 
    yield resource if block_given? 
    respond_with self.resource 
end 

def create 
    build_resource(sign_up_params) 
    resource.save 
    @token = params[:invite_token] 
    if @token != nil 
    org = Invite.find_by_token(@token).calendar #find the calendar attached to the invite 
    resource.calendars.push(org) #add this user to the new calendar as a member 
    else 
    yield resource if block_given? 
    if resource.persisted? 
     if resource.active_for_authentication? 
     set_flash_message :notice, :signed_up if is_flashing_format? 
     sign_up(resource_name, resource) 
     respond_with resource, location: after_sign_up_path_for(resource) 
     else 
     set_flash_message :notice, :"signed_up_but_#{resource.inactive_message}" if is_flashing_format? 
     expire_data_after_sign_in! 
     respond_with resource, location: after_inactive_sign_up_path_for(resource) 
     end 
    else 
     clean_up_passwords resource 
     set_minimum_password_length 
     respond_with resource 
    end 
    end 
end 

Это имеет смысл вообще?

-----

Итак, есть ли способ, чтобы вытащить содержание моего текущего Devise::RegistrationsController где-то в приложении?

Если нет, делает ли смысл код, который я рассматриваю при реализации?

+0

Какое действие 'create'? –

+0

Нет проблем. Я попробовал код из UPDATE 2 и, похоже, работает до сих пор. –

+1

Да, я не видел update2, поэтому теперь мне было лучше для меня – Antoine

ответ

4

Вы можете использовать:

bundle open devise # bundle will open devise folder in your editor 

О коде:

Там очень чистое решение.Посмотрите на этот код:

def new 
    build_resource({}) 
    set_minimum_password_length 
    yield resource if block_given? 
    respond_with self.resource 
end 

Это почти естественный английский, только yield resource if block_given? линия может сбить вас с толку. Эта строка делает следующее: если метод new вызывается с блоком, то передайте resource переменной этому блоку и выполните его. Это делается, прежде всего, для упрощения добавления пользовательского поведения и перезаписи.

Таким образом, мы можем переписать этот код следующим образом:

def new 
    # here you don't need this `resource` variable, but somebody may need it 
    super do |resource| 
    @token = params[:invite_token] 
    end 
end 

, абсолютно такой же, как если бы вы написать

def new 
    build_resource({}) 
    set_minimum_password_length 
    @token = params[:invite_token] 
    respond_with self.resource 
end 

EDIT 2: Попробуйте это:

def create 
    super do |resource| 
    @token = params[:invite_token] 
    if @token != nil 
     org = Invite.find_by_token(@token).calendar #find the calendar attached to the invite 
     resource.calendars.push(org) #add this user to the new calendar as a member 
    end 
    end 
end   
+0

Спасибо. Я получил 'Чтобы открыть связанный драгоценный камень, установить $ EDITOR или $ BUNDLER_EDITOR', поэтому я запускал' export EDITOR = 'subl -w' 'и теперь, когда я снова пытаюсь запустить' bundle open devize', я получаю 'Could not run ' subl /Users/TXC/.rvm/gems/ruby-2.2.1/gems/devise-3.5.2 ' 'Любая идея, как сделать эту работу? –

+0

Awesome, большое спасибо за код действия 'new'. Не могли бы вы случайно предложить какое-либо предложение для кода действия 'create'? –

+1

Странно, Sublime отлично работает для меня. Открывает ли она текущую папку с 'subl .'? Если нет, открывает ли он любой файл из командной строки? –

0

Если вы хотите увидеть, какая версия Devise вы используете, запустите этот ком в терминале: gem which devise. Чтобы вы могли проверить правильный исходный код на своем GitHub на основе используемой вами версии.

+0

Спасибо за ваш комментарий. Я на самом деле не пытаюсь посмотреть, какую версию Devise я использую (я это знаю). Я хочу получить доступ к текущему коду моего Devise RegistrationsCtronoller, чтобы узнать, как я могу реализовать изменения, которые мне нужно сделать. –

+0

Я думаю, что вы только что получили свой ответ выше :-) – Antoine