Разработать форму внутри другого контроллера


Я использую devise gem для процедур sign_in/sign_out.

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

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

Я создал еще один файл devise/sessions / _form.формат html.Эрб и сделал <%= render 'form' %> в рамках нового.формат html.erb файл, и это сработало очень хорошо.

теперь я хотел включить эту форму из другого контроллера. Так в контроллере называется 'main', (в частности, на странице просмотра) ' сеть/индекс.формат html.Эрб' я включил . Кажется, что включение работало нормально, но я получаю следующую ошибку.

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... Как я могу решить эту проблему в пути rails?

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

должен ли я указать что-то (ресурс) в "главном" контроллере?

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

5 118

5 ответов:

Как говорит Андрес, форма вызывает помощников, которые указаны Devise и поэтому не присутствуют при доступе к форме 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/

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

источник

<%= 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 %> 

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

The начальник gem-это место, откуда поступают объекты" ресурс". Если вы хотите копнуть глубже, это было бы место, чтобы смотреть.

я получал ту же ошибку 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

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

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?