2010-11-02 26 views
117

Tôi đang sử dụng đá quý cho các thủ tục sign_in/sign_out.Hình thức phát triển trong một bộ điều khiển khác nhau

tôi tạo ra quan điểm tập tin từ devise, sử dụng rails g devise views

tôi thấy có một devise/buổi/file new.html.erb trong đó có một hình thức cho sign_in.

Tôi đã tạo một tệp khác tạo/phiên/_form.html.erb và đã làm <%= render 'form' %> trong tệp new.html.erb và điều đó đã hoạt động rất tốt.

Bây giờ, tôi muốn đưa biểu mẫu này từ bộ điều khiển khác. Vì vậy, trong một bộ điều khiển được gọi là 'chính', (cụ thể là trong trang xem) 'mains/index.html.erb' Tôi đã bao gồm tệp <%= render 'devise/sessions/form' %>. Có vẻ như bao gồm làm việc tốt, nhưng tôi nhận được lỗi sau.

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: 

Dường như form_for (tài nguyên, ...) phần gây ra vấn đề (mà hoạt động tốt nếu tôi về bản gốc sign_in trang devise ... Làm thế nào tôi có thể giải quyết vấn đề này trong đường ray cách?

cá nhân tôi thích sử dụng 'làm' chức năng bao gồm các hình thức, chứ không phải viết mã html inline.

tôi có phải chỉ định một cái gì đó (tài nguyên) trong bộ điều khiển 'chính'?

tôi sẽ đánh giá cao sự giúp đỡ của bạn.Cảm ơn bạn

+0

Có giải pháp nào không ...? Tính đến tháng 11/16 tôi đã không thực sự có giải pháp bằng cách sử dụng render .. mặc dù nếu tôi chỉ cần gõ vào mã nội tuyến, nó hoạt động tốt có vẻ như .. – user482594

+0

bạn đã tìm thấy một giải pháp cho điều này? – neebz

+0

Có, tôi đã chọn câu trả lời giải quyết vấn đề của mình. Nó đơn giản hơn tôi nghĩ. – user482594

Trả lời

221

Như Andres nói, biểu mẫu gọi người trợ giúp được chỉ định bởi Devise và do đó không có mặt khi bạn truy cập biểu mẫu Devise từ bộ điều khiển không phải là Devise.

Để giải quyết vấn đề này, bạn cần phải thêm các phương thức sau vào lớp trình trợ giúp của bộ điều khiển mà bạn muốn hiển thị biểu mẫu bên dưới. Ngoài ra, bạn chỉ có thể thêm chúng vào ứng dụng trợ giúp của bạn để làm cho chúng có sẵn ở bất cứ đâu.

def resource_name 
    :user 
    end 

    def resource 
    @resource ||= User.new 
    end 

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

Nguồn: http://pupeno.com/blog/show-a-devise-log-in-form-in-another-page/

+8

Cuối cùng tôi đã hiểu mọi thứ ngày hôm nay sau khi đọc nó. – user482594

+5

Tuyệt vời. Hãy chắc chắn rằng nó đi trong helper, không phải trong bộ điều khiển. Ngoài ra, điều này có thể dẫn đến các vấn đề lớn nếu bạn có các tài nguyên khác (ví dụ: các công ty cũng có thể đăng nhập) và bạn muốn tải biểu mẫu của họ. Đảm bảo xác định lại tên và định tuyến có thể trở thành sự cố. –

+1

Điều xấu về giải pháp này là nó phá vỡ 'inherited_resources'. – jrhorn424

4

Biểu mẫu bạn đã tạo hoạt động khi được hiển thị từ bộ điều khiển Devise vì "tài nguyên" được xác định thông qua Devise. Hãy xem triển khai thực hiện của Devise SessionsController - từ những gì tôi hiểu, bạn đang cố gắng sao chép hành động "mới". Phương thức "build_resource" có thể là những gì bạn đang tìm kiếm.

Đá quý Warden là nơi các đối tượng "tài nguyên" đến từ đó. Nếu bạn muốn đào sâu hơn, đó sẽ là nơi để tìm kiếm.

+0

Tôi chỉ được gọi là 'build_resource' với trong một mains_controller, nhưng nó gọi ra [undefined local variable hoặc method 'build_resource '] error. Tôi đã thử bao gồm devise internal helper bằng cách chèn 'include Devise :: Controllers :: InternalHelpers' ở trên cùng của 'mains_controller' nhưng nó cũng gọi ra lỗi với 'AbstractController :: ActionNotFound' – user482594

8

có thể thử loại này cũng ... kiểm tra question này.

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

Đây có phải là phương pháp hay nhất cho tất cả các câu trả lời không? – allegutta

2

tôi đã nhận được báo lỗi tương tự undefined local variable or method "resource" bạn mô tả từ một trong các bộ điều khiển của tôi, bởi vì lớp cơ sở điều khiển của tôi đã mất tích sau (Rails-API ActionController :: API là có lỗi):

include ActionController::Helpers 

Do đó, phương pháp trợ giúp từ Devise không thể giải quyết được trong chế độ xem.

Để làm cho công việc lập mưu với Rails-API tôi cần phải bao gồm:

class ApplicationController < ActionController::API 

    include AbstractController::Rendering 
    include AbstractController::Layouts 
    include ActionController::MimeResponds 
    include AbstractController::Translation 
    include ActionController::ImplicitRender 
    include ActionController::Helpers 
2

Để tinh chỉnh về câu trả lời được chấp nhận, chúng tôi sử dụng helper này để cho phép loại khác nhau của các nguồn lực:

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 

nơi admin_controller? là nội dung chúng tôi có từ trước đây trong số ApplicationController để xử lý chuyển hướng đăng nhập:

def admin_controller? 
    !devise_controller? and request.path =~ /^\/admin/ 
end 
helper_method :admin_controller? 
Các vấn đề liên quan