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

Ruby on rails 在不同的控制器中设计表单,ruby-on-rails,ruby-on-rails-3,devise,Ruby On Rails,Ruby On Rails 3,Devise,我正在使用Desive gem进行登录/注销程序 我使用rails g designe视图从designe生成了视图文件 我看到有一个designe/sessions/new.html.erb文件,其中包含用于登录的表单 我创建了另一个文件devise/sessions/_form.html.erb,并在一个新的.html.erb文件中执行了,结果非常好 现在,我想包含来自不同控制器的表单。因此,在一个名为“main”的控制器中(特别是在视图页面中)“mains/index.html.erb”包

我正在使用Desive gem进行登录/注销程序

我使用
rails g designe视图从designe生成了视图文件

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

我创建了另一个文件devise/sessions/_form.html.erb,并在一个新的.html.erb文件中执行了
,结果非常好

现在,我想包含来自不同控制器的表单。因此,在一个名为“main”的控制器中(特别是在视图页面中)“mains/index.html.erb”包含了
文件。似乎包含工作很好,但我得到以下错误

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: 
主电源索引中的名称错误 显示/home/administrator/Ruby/site_v4_Ruby/app/views/designe/sessions/_form.html.erb,其中第1行出现: 未定义的局部变量或方法“resource”# 提取的源(第1行附近): 1:resource_name,:url=>session_path(resource_name))do | f |%> 2:
3:

4:
似乎是(资源,…)部分的表单_导致了问题(如果我在页面中的原始设计符号_上,那么效果很好…如何以rails方式解决此问题

我个人更喜欢使用“render”函数来包含表单,而不是内联编写html代码

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


我将感谢您的帮助。谢谢。

您创建的表单在从Deviate控制器呈现时工作正常,因为“资源”是通过Deviate定义的。请查看的实现-据我所知,您正在尝试复制“新”操作。您可能正在关注的方法是“构建资源”


gem是“资源”对象的来源。如果你想深入挖掘,那就是你可以去看的地方。

正如Andres所说,表单调用由Desive指定的帮助程序,因此当你从非Desive控制器访问Desive表单时,这些帮助程序不存在

要解决此问题,您需要将以下方法添加到要在其下显示表单的控制器的帮助器类中。或者,您也可以将它们添加到应用程序帮助器中,使其在任何位置都可用

  def resource_name
    :user
  end

  def resource
    @resource ||= User.new
  end

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

来源:

您也可以尝试一下……检查一下

user_session_path)do | f |%>

我从我的一个控制器中得到了与您描述的相同的错误
未定义的局部变量或方法“resource”
,因为我的控制器基类缺少以下内容(Rails API ActionController::API出错):

因此,Deave的助手方法无法在视图中解决

要使Desive与Rails API一起工作,我需要包括:

class ApplicationController < ActionController::API

  include AbstractController::Rendering
  include AbstractController::Layouts
  include ActionController::MimeResponds
  include AbstractController::Translation
  include ActionController::ImplicitRender
  include ActionController::Helpers
class ApplicationController
为了完善已接受的答案,我们使用此帮助器允许使用不同类型的资源:

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\u controller?
是我们以前在
ApplicationController
中处理登录重定向的工具:

def admin_controller?
  !devise_controller? and request.path =~ /^\/admin/
end
helper_method :admin_controller?

我刚刚在一个mains_控制器中调用了'build_resource',但它调用了[undefined local variable或method'build_resource']error。我尝试通过在“mains_controller”的顶部插入“include designe::Controllers::InternalHelpers”来包含designe internal helper,但它也调用了“AbstractController::ActionNotFound”的错误。是否有解决方案。。。?截至11月16日,我还没有真正得到使用render的解决方案。。虽然如果我只是输入内联代码,它似乎工作得很好。你找到了解决这个问题的方法吗?是的,我选择了解决我问题的答案。这比我想象的要简单。太好了。确保它进入辅助对象,而不是控制器。此外,如果您有其他资源(例如,也可以登录的公司)并且希望加载他们的表单,这可能会导致巨大的问题。确保重新定义名称,路由可能也会成为一个问题。此解决方案的缺点是它会破坏继承的\u资源。要限制这些方法的范围(例如,避免与其他gem的命名空间冲突),请尝试将上述方法添加到控制器本身,随着
helper\u方法:resource\u name,:resource\u class,:resource,:designe\u mapping
(在较新的designe版本中,
:resource\u class
似乎是一个要求)。如果我们的designe模型很少,该怎么解决呢?我有两个designe模型,需要在主页上登录。你知道怎么做与你的答案相似的事情吗?这不是所有答案中最好的练习吗?
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
def admin_controller?
  !devise_controller? and request.path =~ /^\/admin/
end
helper_method :admin_controller?