Получить идентификатор пользователя для текущего пользователя с помощью 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