Rails menambahkan tampilan baru untuk dirancang

Saya telah menghasilkan tampilan dengan perintah ini setelah saya menginstal perangkat

rails generate devise:views

dan saya mengganti pengontrol registrasi dengan

class RegistrationsController < Devise::RegistrationsController

  def sign_up2

  end
end

Dan memperbarui rute.rb dengan

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

Saya berharap melihat rute/pemandangan baru

  /users/sign_up2

tapi saya tidak melihatnya. Dan inilah rute untuk merancang

        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

Tapi saya ingin tampilan dan rute baru

Pembaruan: masalah saat saya memuat tampilan

First argument in form cannot contain nil or be empty

di baris ini

<%= 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 sumber
comment
Tampilan dan rute apa yang ingin Anda tambahkan?   -  person zeantsoi    schedule 16.12.2013
comment
Dipahami. Lihatlah jawaban saya.   -  person zeantsoi    schedule 16.12.2013


Jawaban (1)


Panggil blok devise_scope dan nyatakan rute khusus Anda di dalam:

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

Bagian Mengonfigurasi rute dalam dokumentasi memberikan penjelasan devise_scope berikut:

Jika Anda memerlukan penyesuaian yang lebih mendalam, misalnya mengizinkan "/sign_in" selain "/users/sign_in", yang perlu Anda lakukan hanyalah membuat rute secara normal dan membungkusnya dalam blok devise_scope di router

Sebelumnya, Rancangan mengizinkan rute khusus untuk diteruskan sebagai blok ke devise_for, namun perilaku ini tidak digunakan lagi.

PEMBARUAN:

Untuk mengatasi kesalahan First argument in form cannot contain nil or be empty, Anda perlu memastikan bahwa tindakan sign_up2 khusus Anda mengatur variabel resource dengan benar. Dengan asumsi Anda ingin meniru tindakan registrations/new, Anda dapat melakukan sesuatu seperti berikut:

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

Hal ini memastikan bahwa variabel resource dalam tampilan Anda bukan nil dan tidak akan memunculkan pengecualian yang sedang Anda lihat.

Atau, bergantung pada perilaku yang ingin Anda tunjukkan, Anda dapat menyetel variabel instan Anda sendiri dalam tindakan pengontrol khusus, lalu meneruskannya sebagai sumber daya ke tag form_for Anda:

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

Namun, jika Anda mengikuti pendekatan ini, Anda harus mempertimbangkan mengapa Anda perlu memasukkannya ke dalam Rancangan. Rancangan, secara default, menetapkan variabel resource melalui fungsi build_resource. Jika Anda ingin mengganti/melewati fungsi ini, Anda harus mempertimbangkan untuk mengabstraksi seluruh fungsi ini dari Rancangan karena Anda benar-benar menghindari perilaku defaultnya.

person zeantsoi    schedule 15.12.2013
comment
Terima kasih banyak, saya dapat memuat tampilannya sekarang tetapi dengan sedikit masalah, Bisakah Anda membantu? - person wwli; 16.12.2013
comment
Apa masalahmu? Selain itu, jika jawaban ini menjawab pertanyaan awal Anda, terimalah jawaban tersebut sebagai jawaban yang benar. - person zeantsoi; 16.12.2013
comment
Lihat pembaruan saya. Jika ini menjawab pertanyaan Anda secara lengkap, terimalah jawaban ini sebagai benar. - person zeantsoi; 16.12.2013