2010-11-02 42 views
117

我正在爲sign_in/sign_out程序使用設計gem。在不同的控制器中設計窗體

我生成的視圖文件從色器件,使用rails g devise views

我看到有其中載有sign_in形式有一項/會話/ 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(資源,...)部分引起的問題(如果我原來的色器件sign_in頁...我該如何解決在軌方式這個問題呢?

上工作正常

我個人更喜歡使用「渲染」功能,包括形式,而不是內聯編寫HTML代碼。

我必須註明「主」控制器內的東西(資源)?

我會感謝您的幫助,謝謝

+0

有沒有解決方法...?截至11月16日我還沒有真正得到使用渲染的解決方案..雖然如果我只是鍵入內聯代碼,它看起來工作得很好.. – user482594 2010-11-16 15:13:18

+0

你找到了解決方案嗎? – neebz 2011-06-29 13:15:45

+0

是的,我選擇瞭解決我的問題的答案。這比我想象的更簡單。 – user482594 2011-10-17 18:04:01

回答

221

由於安德烈斯說,調用的形式,其被設計指定的,所以當你從非設計控制器訪問設計形式不存在幫手。

要解決這個問題,你需要將以下方法添加到輔助類要顯示在表格的控制器。或者,您可以將它們添加到您的應用程序助手中,以使它們在任何地方都可用。

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

在閱讀完本文後,我終於明白了一切。 – user482594 2011-09-19 03:08:22

+5

優秀。確保它在助手中,而不是在控制器中。另外,如果您有其他資源(例如,也可以登錄的公司)並且您想要加載其表單,這可能會導致嚴重問題。確保重新定義名稱,並且路由也可能成爲問題。 – 2013-03-28 13:55:41

+1

這個解決方案的壞處是它打破了'inherited_resources'。 – jrhorn424 2013-10-02 22:04:54

4

您創建的表單在從Devise控制器呈現時工作,因爲「資源」是通過Devise定義的。看看Devise SessionsController的實現 - 根據我的理解,您試圖複製「新」操作。 「build_resource」方法可能是你正在尋找的。

Warden寶石是這裏的「資源」對象的來源。如果你想深入挖掘,那就應該看看。

+0

我只是在mains_controller中調用'build_resource',但它調用了[未定義的局部變量或方法'build_resource']錯誤。我嘗試在'mains_controller'的頂部插入'include Devise :: Controllers :: InternalHelpers'來包含devise內部幫助器,但它也會通過'AbstractController :: ActionNotFound'調用錯誤 – user482594 2010-11-03 05:45:12

8

可以試試這個也...檢查這個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 %> 
+0

這不是所有答案的最佳做法嗎? – allegutta 2014-04-30 17:56:52

2

我得到了同樣的錯誤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 
2

精益求精接受的答案,我們用這個幫手,讓不同類型的資源:

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? 
相關問題