Получить идентификатор пользователя для текущего пользователя с помощью Devise / Rails

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

теперь у меня есть это в моем контроллере:

def index
  @currentUser = current_user.id
end

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

<% 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 плох, но я понятия не имею, как это исправить. Было несколько подобных вопросов в стеке, но ни один из них на самом деле обратились ко мне или помогли.

спасибо заранее!

5 ответов


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

def index
  @currentUser = current_user.id
end

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

во-вторых, вы проверяете "способность", сравнивая значения идентификаторов, я бы изменил ваш код, чтобы сделать это

<% if allow_product_delete?(@product) %>

вспомогательной

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

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

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

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


прежде всего, Рубин, как undescored_rather_than camelCased стиль.

во-вторых, вам нужны два равных знака вместо трех. @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 %> (по-моему)


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

@currentUser = current_user.id

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

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

тогда во всем вашем приложении вы можете использовать current_user.id или current_user.name или что вы необходимый.

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


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

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

if current_user == @product.user

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

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

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

if current_user.id == @product.user_id

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

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

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


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

User
has_many :group_events

GroupEvent
belongs_to :user

в этом сценарии вместо сравнения идентификаторов можно напрямую сравнить с Ассоциацией:

Bad
@group_event.user_id == current_user.id

Good
@group_event.user == current_user