Разработайте форму в другом контроллере - PullRequest
122 голосов
/ 02 ноября 2010

Я использую самоцвет для разработки процедур sign_in / sign_out.

Я создал файлы представлений из устройства, используя rails g devise views

Я увидел файл devise / session / new.html.erb, который содержал форму для sign_in.

Я создал другой файл devise / session / _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, ...) вызывает проблему (которая работает нормально, если я нахожусь на оригинальной странице devise sign_in ... Как я могу решить эту проблему путями?

Лично я предпочитаю использовать функцию 'render' для включения формы, а не писать встроенные html-коды.

Должен ли я указывать что-то (ресурс) внутри «основного» контроллера?

Буду признателен за вашу помощь. Спасибо.

Ответы [ 5 ]

231 голосов
/ 18 июня 2011

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

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

  def resource_name
    :user
  end

  def resource
    @resource ||= User.new
  end

  def devise_mapping
    @devise_mapping ||= Devise.mappings[:user]
  end

Источник: http://pupeno.com/blog/show-a-devise-log-in-form-in-another-page/

8 голосов
/ 26 марта 2013

Можно попробовать и это ... проверить вопрос .

Источник

<%= form_for("user", :url => user_session_path) do |f| %>
  <%= f.text_field :email %>
  <%= f.password_field :password %>
  <%= f.check_box :remember_me %>
  <%= f.label :remember_me %>
  <%= f.submit 'Sign in' %>
  <%= link_to "Forgot your password?", new_password_path('user') %>
<% end %> 
4 голосов
/ 03 ноября 2010

Форма, которую вы создали, работает при визуализации с контроллера Devise, потому что "ресурс" определяется через Devise.Взгляните на реализацию Devise SessionsController - насколько я понимаю, вы пытаетесь воспроизвести «новое» действие.Вероятно, вам нужен метод build_resource.

Драгоценный камень Warden - это то, откуда берутся объекты ресурса.Если вы хотите копать глубже, это было бы место, чтобы посмотреть.

3 голосов
/ 16 декабря 2015

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

def resource_name
  @resource_name ||= if admin_controller?
    :admin_user
  else
    :user
  end
end

def resource
  @resource ||= resource_name.to_s.classify.constantize.new
end

def devise_mapping
  @devise_mapping ||= Devise.mappings[resource_name]
end

где admin_controller? - это то, что мы имеем раньше в ApplicationController для обработки перенаправлений входа в систему:

def admin_controller?
  !devise_controller? and request.path =~ /^\/admin/
end
helper_method :admin_controller?
2 голосов
/ 22 апреля 2015

Я получаю ту же ошибку undefined local variable or method "resource", которую вы описали на одном из моих контроллеров, потому что в базовом классе моего контроллера отсутствовало следующее (Rails-API ActionController :: API был ошибочным):

include ActionController::Helpers

Таким образом, вспомогательные методы из Devise не могут быть разрешены в представлении.

Чтобы заставить Devise работать с Rails-API, мне нужно было включить:

class ApplicationController < ActionController::API

  include AbstractController::Rendering
  include AbstractController::Layouts
  include ActionController::MimeResponds
  include AbstractController::Translation
  include ActionController::ImplicitRender
  include ActionController::Helpers
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...