2017-10-26 3 views
0

Ich bin neueren zu Schienen und nicht sicher, wie man das macht. Ich habe das Standardmodell Benutzer und in Benutzer habe ich 10 verschiedene Attribute. Die 10 Attribute enthalten das Attribut für den Benutzer, um das Wetter auszuwählen, das er vom Typ "a" oder vom Typ "b" ist. Wenn ein Nutzer auf die Anmeldung klickt, möchte er, dass er das Wetter auswählt, das er "a" oder "b" eingegeben hat. Wenn sie den Typ "a" haben, möchte ich sie umleiten, um nur 5 der Attribute auszufüllen. Wenn sie vom Typ "b" sind, möchte ich, dass sie die anderen 4 Attribute ausfüllen. Meine Frage ist, wie erstelle ich die Logik im Controller, wo er mich nach der ersten Frage in das richtige Formular umleitet.Ruby auf Schienen: Model Form

[Bearbeitet]

Würde dies logisch sein?

class UsersController < ApplicationController 
def new 
    @user = User.new 
end 

def create 
    @user = User.new(personality_selection) 

    if @user.save 
     redirect_to root_path 
    else 
     render :new 
    end 
end 

private 
def personality_selection 
    params.require(:user).permit(:personality_a_or_b) 

    if params[:personality] == 'a' 
     redirect_to type_a_path 
    elsif params[:personality] == 'b' 
     redirect_to type_b_path 
    end 
end 

def type_a 
    params.require(:user).permit(:trait2, :trait3, :trait4 :trait5, :trait6) 
end 

def type_b 
    params.requrie(:user).permit(:trait7, :trait8, :trait9, :trait10) 
end 
end 

Antwort

0

Haben Sie ein Anfangsformular, wo der Benutzer die Nicht-Persönlichkeitsinformationen eingibt und ob sie vom Typ 'a' oder 'b' sind. Die Auswahl des Typs 'a' oder 'b' sollte in das Attribut 'personality_type' eingetragen werden.

Beim Speichern wird der Controller auf eine neue persönlichkeitsspezifische Form mit nur Feldern umleiten, die zu dieser Persönlichkeit gehören.

Beim Speichern des nächsten Formulars wird es in der Update-Controller Aktion gespeichert und aktualisiert nur die Persönlichkeitsfelder.

users_controller.rb

class UsersController < ApplicationController 

    def new 
    @user = User.new 
    end 

    def create 
    @user = User.new(user_params) 

    if @user.save 
     if @user.personality_type == 'a'  
     redirect_to edit_personality_a_path(@user) 
     else 
     redirect_to edit_personality_b_path(@user) 
     end 
    else 
     render :new 
    end 
    end 

    def update 
    @user = User.find(params[:id] 
    @user.update(user_params) 
    redirect_to @user 
    end 

    def edit_personality_a 
    @user = User.find(params[:id]) 
    end 

    def edit_personality_b 
    @user = User.find(params[:id]) 
    end 

    private 

    def user_params 
    params.require(:user).permit(..params..) 
    end 
end 

edit_personality_a.html.erb

= form_for @user do |f| 
.... put all the form fields that are specific 'a' personality. 

edit_personality_b.html.erb

= form_for @user do |f| 
.... put all the form fields that are specific 'b' personality. 

routes.rb

resources :users do 
    get 'edit-personality-a' => 'users#edit_personality_a', as: 'edit_personality_a' 
    get 'edit-personality-b' => 'users#edit_personality_b', as: 'edit_personality_b' 
end 
+0

Ich weiß, dass dies nicht richtig ist, und es ist nur ein Beispiel, aber würde es so aussehen? –

+0

Ich habe meine Antwort präzisiert. Viele Möglichkeiten, dies zu tun. Sie könnten auch die beiden Persönlichkeitsformen zu einem zusammenfassen und dann die gewünschten Felder bedingt einblenden. –

+0

Ich schätze Ihre Hilfe. Ich lerne Rails in einem angemessenen Tempo, aber es gibt immer Dinge, die mich stümpfen. Nochmals vielen Dank für die ausführliche Antwort. –