다른 컨트롤러 내에서 양식 작성


129

sign_in / sign_out 프로 시저에 고안 보석을 사용하고 있습니다.

을 사용하여 고안에서 뷰 파일을 생성했습니다. rails g devise views

sign_in에 대한 양식을 포함하는 devise / sessions / new.html.erb 파일이있는 것을 보았습니다.

나는 다른 파일 devise / sessions / _form.html.erb를 만들고 <%= render 'form' %>new.html.erb 파일 내에서 만들었고 매우 잘 작동했습니다.

이제 다른 컨트롤러에서이 양식을 포함하고 싶었습니다. 따라서 '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 페이지에 있으면 잘 작동합니다 ...이 문제를 어떻게 레일로 해결할 수 있습니까?

개인적으로 HTML 코드를 인라인으로 작성하는 대신 '렌더링'기능을 사용하여 양식을 포함하는 것을 선호합니다.

'main'컨트롤러 내에서 무언가 (자원)를 지정해야합니까?

도와 주셔서 감사합니다. 감사합니다.


해결책이 있습니까 ...? 11 월 16 일 현재, 렌더를 사용하여 솔루션을 얻지 못했습니다. 인라인 코드로 입력하면 정상적으로 작동합니다.
user482594

이것에 대한 해결책을 찾았습니까?
neebz 2016 년

예, 문제를 해결하는 답변을 선택했습니다. 생각보다 간단했습니다.
user482594

답변:


241

Andres가 말했듯이이 양식은 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/


6
우수한. 컨트롤러가 아닌 도우미에 들어가야합니다. 또한 다른 리소스 (예 : 로그인 할 수있는 회사)가 있고 양식을로드하려는 경우 큰 문제가 발생할 수 있습니다. 이름을 다시 정의해야합니다. 라우팅도 문제가 될 수 있습니다.
Michael Schmitz

1
이 솔루션의 나쁜 점은 그것이 깨진다는 것 inherited_resources입니다.
jrhorn424

6
이러한 방법의 범위를 제한하고 (예를 들어 다른 gem과 네임 스페이스 충돌을 피하기 위해) 위의 방법을 컨트롤러 자체에 추가해보십시오 helper_method :resource_name, :resource_class, :resource, :devise_mapping( :resource_class최신 Devise 버전에서는 필수 사항 인 것 같습니다).
거품

1
고안 모델이 거의없는 경우 어떤 솔루션을 사용해야합니까?
yozzz

두 가지 Devise 모델이 있으며 홈페이지에서 두 가지 모두 로그인해야합니다. 대답과 비슷한 것을하는 방법을 알고 있습니까?
DR_

8

이것을 시도해 볼 수도 있습니다 ...이 질문을 확인하십시오 .

출처

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

이것이 모든 답변의 모범 사례가 아닙니까?
allegutta

4

"자원"은 Devise를 통해 정의되므로 Devise 컨트롤러에서 렌더링 할 때 만든 양식이 작동합니다. Devise SessionsController 의 구현을 살펴보십시오. 내가 이해 한 바에 따르면, "새로운"액션을 복제하려고합니다. "build_resource"메소드는 아마도 당신이 찾고있는 것일 것입니다.

된 소장 은 "자원"객체가 어디에서 오는지 보석이다. 더 깊이 파고 싶다면 이곳을 살펴보십시오.


방금 mains_controller에서 'build_resource'를 호출했지만 [정의되지 않은 로컬 변수 또는 메소드`build_resource '] 오류가 발생합니다. 나는 'mains_controller'의 상단에있는 '고안 :: 컨트롤러 :: InternalHelpers 포함'삽입하여 유증 내부 도우미 등의 노력뿐만 아니라 '인 AbstractController :: ActionNotFound'로 오류를 호출
user482594을

3

허용되는 답변을 구체화하기 위해이 도우미를 사용하여 다양한 유형의 리소스를 허용합니다.

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?

2

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.