2015-09-08 2 views
6

Итак, я, новичок в рельсах, в настоящее время пытаюсь получить идентификатор пользователя из текущей сессии Devise, и у меня проблемы.Получить UserID для текущего пользователя с помощью Devise/Rails

У меня есть это в мой контроллер в настоящее время:

def index 
    @currentUser = current_user.id 
end 

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

<% if @currentUser === @product.user_id %> 
      <%= link_to "Back", products_path %> 
      <%= link_to "Edit", edit_product_path(@product) %> 
      <%= link_to "Delete", product_path(@product), method: :delete, data: { confirm: "Are you sure?"} %> 
     <% else %> 
      <span></span> 
<% end %> 

У меня есть чувство, мой синтаксис в определении моей переменной CurrentUser плохо, но я понятия не имею, как это исправить. На Stack было несколько подобных вопросов, но никто из них не обращался ко мне и не помогал мне.

Заранее благодарен!

ответ

7

Я вижу несколько проблем здесь

def index 
    @currentUser = current_user.id 
end 

Другого чем @HolyMoly уже комментировал, вы должны использовать подчеркивание и не верблюжий, если current_user равен нуль здесь, .id потерпит неудачу на него, в результате исключения.

Во-вторых, вы проверяете «способность» путем сравнения значений идентификаторов, я хотел бы изменить свой код, чтобы сделать это

<% if allow_product_delete?(@product) %> 

В помощнике

def allow_product_delete?(product) 
    return false unless current_user 
    @product.user_id == current_user.id 
end 

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

Если пользователь не вошел в систему, current_user будет нулевым, вам всегда нужно подготовиться к этому и защитить его.

Последнее, что я хотел бы изучить драгоценные камни (cancan или cancancan), которые предоставляют очень приятный DSL для работы с тем, что вы пытались здесь.

2

Прежде всего, рубин, как undescored_rather_than camelCased style.

Во-вторых, вам нужны два знака равенства вместо трех. @currentUser == @product.user_id должны работать

На третьем, вам не нужно сравнивать целочисленные идентификаторы, вы можете сравнить модели, что-то вроде этого:

<% if current_user == @product.user %> 
    <%= link_to "Back", products_path %> 
    <%= link_to "Edit", edit_product_path(@product) %> 
    <%= link_to "Delete", product_path(@product), method: :delete, data: { confirm: "Are you sure?"} %> 
<% end %> 

Обратите внимание, что я опустил @ в current_user методе, потому что current_user является помощник для разработки, иначе я удалил ненужные <% else %> (на мой взгляд)

+0

Спасибо за быстрый ответ. Я пробовал это, но это не сработало, поэтому я хотел посмотреть, что именно сравнивается, и распечатал '<% = current_user%>' и получил '# '. Связано ли это с тем, что вы сказали о сравнении моделей вместо целых id? – aishaq11

+0

@ aishaq11 это нормальная ситуация - это представление класса 'Object' с его уникальным идентификатором. Попробуйте что-то вроде '<% = current_user.id%>' и '<% = product.user_id%>' при том же рендеринге. Значения id одинаковы? – asiniy

2

Вы установили его, чтобы действительно иметь возможность пользователя current_user? в коде у вас есть:

@currentUser = current_user.id

Но где current_user определена? Я не использовал Завещание, но с сессиями можно определить значение CURRENT_USER с вспомогательным методом (вы можете также сделать это прямо в методе sessions_controller #create), как это:

def current_user 
    @current_user ||= User.find_by(id: session[:user_id]) 
    end 

затем во всем приложении вы можете использовать current_user.id или current_user.name или все, что вам нужно.

Так что, хотя сеансы не разрабатываются, я надеюсь, что это поможет.

1

Для этого вам необходимо использовать current_user. Вы можете делать это везде в проекте. Нет необходимо определить переменную @currentUser или т.п.

Вы можете сравнить как модели

if current_user == @product.user 

, что является эквивалентом

if current_user.id == @product.user.id 

В некоторых случаях вы можете использовать

if current_user.id == @product.user_id 

Это предотвращает дополнительный запрос sql для загрузки модели пользователя

Если вы используете Завещание для авторизации, и вы должны контролировать доступ действия, которые вы должны увидеть (возможно использовать) драгоценный камень https://github.com/CanCanCommunity/cancancan

https://github.com/airbnb/ruby поможет вам оставаться в гармонии;)

0

Сравнение идентификаторов это не лучшая практика для Rails. Если вы ранее настроили ассоциации правильно, вам не нужно сравнивать между идентификаторами. Например:

User 
has_many :group_events 

GroupEvent 
belongs_to :user 

В этом случае, вместо сравнения идентификаторов, вы можете непосредственно сравнить с ассоциацией:

Bad 
@group_event.user_id == current_user.id 

Good 
@group_event.user == current_user 
Смежные вопросы