Я использую драгоценный камень разработки для процедур sign_in / sign_out.
Я создал файлы представлений из devise, используя rails g devise views
Я видел, что есть файл devise / sessions / new.html.erb, который содержит форму для sign_in.
Я создал еще один файл devise / sessions / _form.html.erb и сделал <%= render 'form' %>
это в файле new.html.erb, и это сработало очень хорошо.
Теперь я хотел включить эту форму из другого контроллера. Итак, в контроллере под названием «main» (в частности, на странице просмотра) «mains / index.html.erb» я включил <%= render 'devise/sessions/form' %>
файл. Кажется, что включение сработало, но я получаю следующую ошибку.
NameError in Mains#index
Showing /home/administrator/Ruby/site_v4_ruby/app/views/devise/sessions/_form.html.erb where line #1 raised:
undefined local variable or method `resource' for #<#<Class:0x007f1aa042d530>:0x007f1aa042b870>
Extracted source (around line #1):
1: <%= form_for(resource, :as => resource_name, :url => session_path(resource_name)) do |f| %>
2: <p><%= f.label :email %><br />
3: <%= f.text_field :email %></p>
4:
Кажется, что часть form_for (resource, ...) вызывает проблему (которая отлично работает, если я нахожусь на исходной странице sign_in разработки ... Как я могу решить эту проблему с помощью рельсов?
Я лично предпочитаю использовать функцию «рендеринга» для включения формы, а не писать встроенные HTML-коды.
Нужно ли мне указывать что-то (ресурс) в «основном» контроллере?
Буду признателен за вашу помощь. Спасибо.
источник
Ответы:
Как говорит Андрес, форма вызывает помощников, которые указаны в Devise и поэтому отсутствуют, когда вы обращаетесь к форме Devise из контроллера, отличного от Devise.
Чтобы обойти это, вам нужно добавить следующие методы к вспомогательному классу контроллера, под которым вы хотите отображать форму. Кроме того, вы можете просто добавить их в помощник приложения, чтобы сделать их доступными где угодно.
Источник: http://pupeno.com/blog/show-a-devise-log-in-form-in-another-page/
источник
inherited_resources
.helper_method :resource_name, :resource_class, :resource, :devise_mapping
(:resource_class
кажется, это требование в новых версиях Devise).Можете попробовать и это ... проверьте этот вопрос .
Источник
источник
Созданная вами форма работает при визуализации из контроллера Devise, потому что «ресурс» определяется через Devise. Взгляните на реализацию Devise SessionsController - насколько я понимаю, вы пытаетесь воспроизвести «новое» действие. Возможно, вам нужен метод build_resource.
Warden самоцвет где «ресурс» объекты как . Если вы хотите копнуть глубже, вам стоит поискать это место.
источник
Чтобы уточнить принятый ответ, мы используем этот помощник, чтобы разрешить различные типы ресурсов:
где
admin_controller?
что-то, что у нас было раньше,ApplicationController
для обработки перенаправления входа в систему:источник
Я получал ту же ошибку, которую
undefined local variable or method "resource"
вы описываете, от одного из моих контроллеров, потому что в моем базовом классе контроллера отсутствовало следующее (Rails-API ActionController :: API был виноват):Таким образом, вспомогательные методы из Devise не могут быть разрешены в представлении.
Чтобы Devise работал с Rails-API, мне нужно было включить:
источник