Rails เพิ่มมุมมองใหม่ให้กับการประดิษฐ์

ฉันได้สร้างมุมมองด้วยคำสั่งนี้หลังจากติดตั้งอุปกรณ์แล้ว

rails generate devise:views

และฉันแทนที่ตัวควบคุมการลงทะเบียนด้วย

class RegistrationsController < Devise::RegistrationsController

  def sign_up2

  end
end

และอัพเดตเส้นทาง.rbด้วย

  devise_for :users, :controllers => { :registrations => "registrations" }  

ฉันคาดว่าจะเห็นเส้นทาง / มุมมองใหม่ของ

  /users/sign_up2

แต่ฉันไม่เห็นมัน และนี่คือเส้นทางสำหรับการประดิษฐ์

        new_user_session GET    /users/sign_in(.:format)       devise/sessions#new
            user_session POST   /users/sign_in(.:format)       devise/sessions#create
    destroy_user_session DELETE /users/sign_out(.:format)      devise/sessions#destroy
           user_password POST   /users/password(.:format)      devise/passwords#create
       new_user_password GET    /users/password/new(.:format)  devise/passwords#new
      edit_user_password GET    /users/password/edit(.:format) devise/passwords#edit
                         PATCH  /users/password(.:format)      devise/passwords#update
                         PUT    /users/password(.:format)      devise/passwords#update
cancel_user_registration GET    /users/cancel(.:format)        registrations#cancel
       user_registration POST   /users(.:format)               registrations#create
   new_user_registration GET    /users/sign_up(.:format)       registrations#new
  edit_user_registration GET    /users/edit(.:format)          registrations#edit
                         PATCH  /users(.:format)               registrations#update
                         PUT    /users(.:format)               registrations#update
                         DELETE /users(.:format)               registrations#destroy

แต่ฉันอยากได้มุมมองและเส้นทางใหม่

อัปเดต: ปัญหาเมื่อฉันโหลดมุมมอง

First argument in form cannot contain nil or be empty

ในบรรทัดนี้

<%= form_for(resource, :as => resource_name,:html => { :class => "form-horizontal col-sm-12",:role=>"form"}, :url => user_registration_path(resource_name)) do |f| %>

person wwli    schedule 15.12.2013    source แหล่งที่มา
comment
คุณต้องการเพิ่มมุมมองและเส้นทางใด   -  person zeantsoi    schedule 16.12.2013
comment
เข้าใจแล้ว. ลองดูคำตอบของฉันสิ   -  person zeantsoi    schedule 16.12.2013


คำตอบ (1)


เรียกใช้บล็อก devise_scope และประกาศเส้นทางที่คุณกำหนดเองภายใน:

devise_for :users, :controllers => { :registrations => "registrations" }  
devise_scope :user do
  get "users/sign_up2"=> "users/registrations#sign_up2", :as => "sign_up2_registration"
end

ส่วนที่เกี่ยวกับการกำหนดค่าเส้นทางในเอกสารประกอบให้คำอธิบายต่อไปนี้ของ devise_scope:

หากคุณต้องการการปรับแต่งที่ลึกซึ้งยิ่งขึ้น เช่น เพื่ออนุญาต "/sign_in" นอกเหนือจาก "/users/sign_in" สิ่งที่คุณต้องทำคือสร้างเส้นทางของคุณตามปกติและรวมเส้นทางเหล่านั้นไว้ในบล็อก devise_scope ในเราเตอร์

ก่อนหน้านี้ Devise อนุญาตให้ส่งเส้นทางที่กำหนดเองเป็นบล็อกไปยัง devise_for แต่ ลักษณะการทำงานนี้เลิกใช้แล้ว.

อัปเดต:

เพื่อแก้ไขข้อผิดพลาด First argument in form cannot contain nil or be empty คุณต้องแน่ใจว่าการกระทำ sign_up2 ที่คุณกำหนดเองนั้นตั้งค่าตัวแปร resource อย่างถูกต้อง สมมติว่าคุณต้องการเลียนแบบการกระทำ registrations/new คุณสามารถทำสิ่งที่คล้ายกับสิ่งต่อไปนี้:

def sign_up2
    build_resource({})
    respond_with self.resource
end

เพื่อให้แน่ใจว่าตัวแปร resource ในมุมมองของคุณไม่ใช่ nil และจะไม่ทำให้เกิดข้อยกเว้นที่คุณกำลังพบเห็นอยู่

หรืออีกวิธีหนึ่ง คุณสามารถตั้งค่าตัวแปรอินสแตนซ์ของคุณเองในการดำเนินการของคอนโทรลเลอร์ที่กำหนดเองได้ ขึ้นอยู่กับพฤติกรรมที่คุณพยายามแสดงออกมา จากนั้นส่งต่อเป็นทรัพยากรไปยังแท็ก form_for ของคุณ:

# app/controllers/users/registrations_controller.rb
def sign_up_2
    @new_registrant = Registrant.new
end

# app/views/users/sign_up2.html.erb
<%= form_for(@new_registrant, :as => resource_name,:html => { :class => "form-horizontal col-sm-12",:role=>"form"}, :url => user_registration_path(resource_name)) do |f| %>

อย่างไรก็ตาม หากคุณปฏิบัติตามแนวทางนี้ คุณควรพิจารณาว่าเหตุใดจึงต้องนำสิ่งนี้ไปใช้ใน Devise ตามค่าเริ่มต้น Devise จะกำหนดตัวแปร resource ผ่านฟังก์ชัน build_resource หากคุณกำลังจะแทนที่/ข้ามฟังก์ชันนี้ คุณควรพิจารณาแยกฟังก์ชันการทำงานทั้งหมดนี้ออกจาก Devise เนื่องจากคุณกำลังหลีกเลี่ยงพฤติกรรมเริ่มต้นโดยสิ้นเชิง

person zeantsoi    schedule 15.12.2013
comment
ขอบคุณมาก ฉันสามารถโหลดมุมมองได้แล้ว แต่มีปัญหาเล็กน้อย คุณช่วยได้ไหม - person wwli; 16.12.2013
comment
คุณมีปัญหาอะไร? นอกจากนี้ หากคำตอบนี้ตอบคำถามเดิมของคุณได้ โปรดยอมรับว่าคำตอบนั้นถูกต้อง - person zeantsoi; 16.12.2013
comment
ดูการอัปเดตของฉัน หากตอบคำถามของคุณได้ครบถ้วน โปรดยอมรับคำตอบนี้ว่าถูกต้อง - person zeantsoi; 16.12.2013