2016-01-22 6 views
1

Я пытаюсь сделать приложение в Rails 4.Rails с Завещания и OmniAuth - несколько социальных медиа-провайдеров логин

Я пытаюсь настроить разработать с OmniAuth и каждый из Facebook, LinkedIn, Twitter и googleauth. В настоящее время я пытаюсь следовать этому руководству.

http://sourcey.com/rails-4-omniauth-using-devise-with-twitter-facebook-and-linkedin/

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

user.rb, profile.rb и identity.rb

Ассоциации являются:

Пользователь

has_one :profile, dependent: :destroy 

has_many :identities, dependent: :destroy 

Профиль

belongs_to :user 

Идентичность

belongs_to :user 

Идентичность также подтверждает:

validates_presence_of :uid, :provider 
validates_uniqueness_of :uid, :scope => :provider 

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

Я сделал:

<table class="table table-bordered"> 

        <tr> 
         <td><i class="fa fa-facebook"></i></td> 
         <td> 
         <% if @profile.user.identity.provider == 'facebook' %> 
          <span class="glyphicon glyphicon-ok"</span> 
         <% else %> 
          <%= link_to icon('Connect Facebook', id: 'facebookauth'), user_omniauth_authorize_path(:facebook) %> 
         <% end %> 

         </td> 
        </tr> 

        <tr> 
         <td><i class="fa fa-google"></i></td> 
         <td> 
         <% if @user.identity.provider includes 'googleauth' %> 
          <span class="glyphicon glyphicon-ok"</span> 
         <% else %> 
          <%= link_to icon('Connect Google', id: 'googleauth'), user_omniauth_authorize_path(:google_oauth2) %> 
         <% end %> 

         </td> 
        </tr> 

        <tr> 
         <td><i class="fa fa-linkedin"></i></td> 
         <td> 
         <% if @user.identity.provider includes 'linkedin' %> 
          <span class="glyphicon glyphicon-ok"</span> 
         <% else %> 
          <%= link_to icon('Connect Linkedin', id: 'linkedinauth'), user_omniauth_authorize_path(:linkedin) %> 
         <% end %> 

         </td> 
        </tr> 


        <tr> 
         <td><i class="fa fa-twitter"></i></td>  
         <td> 
         <% if @user.identity.provider includes 'twitter' %> 
          <span class="glyphicon glyphicon-ok"</span> 
         <% else %> 
          <%= link_to icon('Connect Twitter', id: 'twitterauth'), user_omniauth_authorize_path(:twitter) %> 
         <% end %> 

         </td> 
        </tr> 
       </table> 

Я хочу показать это частичное в форме редактирования профиля.

<div class="formheader">Update your profile</div> 

     <div class="row"> 
     <div class="col-md-10 col-md-offset-1"> 
      <%= render 'form' %> 
      <%= render 'users/authentication' %> 

     </div> 
     </div>  

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

Может ли кто-нибудь увидеть, где я ошибся?

Я пытался несколько различных вещей, чтобы получить эти цепи, связанные в том числе:

<% if @profile.user.identity.provider == 'facebook' %> 
<% if @current_user.profile.identity.provider == 'facebook' %> 
<% if @user.profile.identity.provider == 'facebook' %> 

Im просто угадать с этим - я не могу понять это. Может ли кто-нибудь увидеть, что я сделал неправильно?

+0

ОК жаль, если я не даю много объяснений здесь, но, надеюсь, вы найдете ответы здесь: https://github.com/charly/omnidevisable – charlysisto

+0

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

ответ

0

User.identity не будет работать, так как пользователь has_many Identities.

Вы можете сделать что-то вроде @user.identities.map(&:provider).include?('facebook')

+0

Привет, я попробовал это изначально, но забыл знак вопроса и didn ' Знать о карте. Спасибо за это. Я получаю сообщение об ошибке при попытке: <% if @ user.identities.map (: & provider) .include? ('Facebook')%>.Ошибка говорит: синтаксическая ошибка, неожиданный tIDENTIFIER, ожидающий ')'. Я знаю, что сообщение об ошибке означает «)», но я не вижу, где его добавить. Мне кажется. – Mel

+0

@ user2860931my плохо, я обновил свой ответ. Это должно быть '&: поставщик' не': & provider' – miligraf

+0

Спасибо. Эта ошибка перестала появляться. Теперь я получаю еще один, который говорит: ActiveRecord :: RecordNotFound в UsersController # show Не удалось найти пользователя с идентификатором 'id' = authentications. Вы видите, что может быть причиной этого? – Mel

Смежные вопросы