Search code examples
ruby-on-railsformsactioncontroller

Multiple update forms for one model


I want to have multiple forms on one page. Let's make an example to understand what I want:

I have a page for my admins, let's say it's the admins#show page. My admin has to change his name on one form on this page and on another form his age. I know I could create one form but I want to have multiple forms (because this is just an example). So my admins#show page looks something like this:

<%= form_for @admin do |a| %>
    <%= a.label :name %>
    <%= a.text_field :name %>
    <%= a.submit "Submit name change" %>
<% end %>

<%= form_for @admin do |e| %>
    <%= e.label :age %>
    <%= e.number_field :age %>
    <%= e.submit "Submit age change" %>
<% end %>

But in my controller, I don't know really how this works and here is my problem. I think I have something like this, but how could I divide the form inputs in the update method?:

def edit
    @admin = Admin.find(params[:id])
end

def update
    @admin= Admin.find(params[:id])
    if @admin.update_attributes(:name=> admin_params1[:name])
        redirect_to @admin
    else
        render 'edit'
    end

    if @admin.update_attributes(:age=> admin_params2[:age])
        redirect_to @admin
    else
        render 'edit'
    end
end


private

def admin_params1
    params.require(:admin).permit(:name)
end

def admin_params2
    params.require(:admin).permit(:age)
end

Solution

  • Well, I think you could create other non-REST methods in the controller and then add named routes in your config/routes then add your two different forms similar to this;

    <%= form_for :admin_name, url: admin_name_path, method: :post do |a| %>
        <%= a.label :name %>
        <%= a.text_field :name %>
        <%= a.submit "Submit name change" %>
    <% end %>
    
    <%= form_for :admin_age, url: admin_age_path, method: :post do |e| %>
        <%= e.label :age %>
        <%= e.number_field :age %>
        <%= e.submit "Submit age change" %>
    <% end %>
    

    Then something like this;

    def update_age
        @admin = Admin.find(params[:admin_age][:id])
        if params[:admin_age]
            @admin.update_attributes(:age=> params[:admin_age][:age])
            redirect_to @admin
        else
            render 'edit'
        end
    
    end
    
    def update_name
        @admin = Admin.find(params[:admin_name][:id])
        if params[:admin_name]
            @admin.update_attributes(:name=> params[:admin_name][:name])
            redirect_to @admin
        else
            render 'edit'
        end
    
    end
    

    ** not tested for bugs