ChatGPT解决这个技术问题 Extra ChatGPT

在不同的控制器中设计表单

我正在为 sign_in/sign_out 程序使用设计 gem。

我使用 rails g devise views 从设计生成了视图文件

我看到有一个 devise/sessions/new.html.erb 文件,其中包含一个用于登录的表单。

我创建了另一个文件 devise/sessions/_form.html.erb 并在 new.html.erb 文件中执行了 <%= render 'form' %>,结果非常好。

现在,我想从不同的控制器中包含这个表单。因此,在一个名为“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 页面上工作正常......我怎样才能以 rails 方式解决这个问题?

我个人更喜欢使用“渲染”功能来包含表单,而不是内联编写 html 代码。

我是否必须在“主”控制器中指定某些东西(资源)?

我会感谢你的帮助。谢谢你。

有什么解决办法...?截至 11 月 16 日,我还没有真正得到使用渲染的解决方案.. 虽然如果我只是输入内联代码,它似乎可以正常工作..
你找到解决方案了吗?
是的,我选择了解决我的问题的答案。这比我想象的要简单。

R
Rupert Madden-Abbott

正如 Andres 所说,表单调用了由 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/


出色的。确保它进入助手,而不是控制器。此外,如果您有其他资源(例如也可以登录的公司)并且您想加载他们的表单,这可能会导致巨大的问题。确保重新定义名称,路由也可能成为问题。
这个解决方案的坏处是它破坏了 inherited_resources
要限制这些方法的范围(例如避免与其他 gem 的命名空间冲突),请尝试将上述方法与 helper_method :resource_name, :resource_class, :resource, :devise_mapping 一起添加到控制器本身(:resource_class 似乎是较新的 Devise 版本中的要求) .
如果我们的设计模型很少,应该有什么解决方案?
我有两个设计模型,需要在主页上登录。知道如何做与您的答案类似的事情吗?
C
Community

也可以试试这个...检查这个question

Source

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

这不是所有答案的最佳实践吗?
A
Andres Freyria

您创建的表单在从 Devise 控制器呈现时有效,因为“资源”是通过 Devise 定义的。看看 Devise SessionsController 的实现 - 据我了解,您正在尝试复制“新”操作。方法“build_resource”可能是您所关心的。

Warden gem 是“资源”对象的来源。如果您想深入挖掘,那将是寻找的地方。


我刚刚在 mains_controller 中调用了“build_resource”,但它调用了 [undefined local variable or method `build_resource'] 错误。我尝试通过在“mains_controller”顶部插入“include Devise::Controllers::InternalHelpers”来包含设计内部帮助程序,但它也调用了“AbstractController::ActionNotFound”错误
b
bbozo

为了完善已接受的答案,我们使用此帮助器来允许不同类型的资源:

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?

C
Christopher Oezbek

我从我的一个控制器中遇到了与您描述的相同的错误 undefined local variable or method "resource",因为我的控制器基类缺少以下内容(Rails-API ActionController::API 有问题):

include ActionController::Helpers

因此,来自 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

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅