Разработать форму внутри другого контроллера
Я использую 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 ответов:
Как говорит Андрес, форма вызывает помощников, которые указаны 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?