How to use the same form to create and edit in ruby ​​on rails

I'm new to ruby. I have the same form, but I need it to create / update as needed. The problem is that whenever I call editing, and not edit information about an existing user, I get a new user with the edited data. Simply put, I think that whenever I do the editing, the create method is called.

So, is there a way to use one form for new and for editing instead of using separate forms.

The following code is for editing user information:

<%= link_to 'Home', root_path %> <h2>Edit user</h2> <%= form_for :user, url: user_index_path do |f| %> <p> <%= f.label :name %><br> <%= f.text_field :name %> </p> <p> <%= f.label :address %><br> <%= f.text_area :address %> </p> <p> <%= f.label :email %><br> <%= f.text_field :email %> </p> <p> <%= f.label :phone %><br> <%= f.text_field :phone %> </p> <p> <%= f.label :state %><br> <%= f.text_field :state %> </p> <p> <%= f.label :country %> <%= f.collection_select(:country, Country.all, :name, :name) %> </p> <p> <%= f.submit %> </p> <% end %> 

The following code is for creating a user:

  <%= link_to 'Home', root_path %> <h2>Create new user</h2> <%= form_for :user, url: user_index_path do |f| %> <p> <%= f.label :name %><br> <%= f.text_field :name %> </p> <p> <%= f.label :address %><br> <%= f.text_area :address %> </p> <p> <%= f.label :email %><br> <%= f.text_field :email %> </p> <p> <%= f.label :phone %><br> <%= f.text_field :phone %> </p> <p> <%= f.label :state %><br> <%= f.text_field :state %> </p> <p> <%= f.label :country %> <%= f.collection_select(:country, Country.all, :name, :name) %> </p> <p> <%= f.submit %> </p> <% end %> 

And this is my controller:

  class UserController < ApplicationController def index @users = User.all end def show @user = User.find(params[:id]) end def new @user = User.new end def create @user = User.new(user_params) if @user.save redirect_to @user else render 'new' end end def edit @user = User.find(params[:id]) end def update #@user = User.find(params[:id]) if @user.update(user_params) redirect_to @user else render 'edit' end end def destroy @user = User.find(params[:id]) @user.destroy redirect_to user_index_path end private def user_params params.require(:user).permit(:name, :address, :email, :phone, :state, :country) end end 

Since I am new to ruby, I have not received accurate data on how http requests work in ruby.

+6
source share
1 answer

users / _form.html.erb

  <%= link_to 'Home', root_path %> <%= form_for @user do |f| %> <p> <%= f.label :name %><br> <%= f.text_field :name %> </p> <p> <%= f.label :address %><br> <%= f.text_area :address %> </p> <p> <%= f.label :email %><br> <%= f.text_field :email %> </p> <p> <%= f.label :phone %><br> <%= f.text_field :phone %> </p> <p> <%= f.label :state %><br> <%= f.text_field :state %> </p> <p> <%= f.label :country %> <%= f.collection_select(:country, Country.all, :name, :name) %> </p> <p> <%= f.submit %> </p> <% end %> 

users / new.html.erb

 <h2>Create new user</h2> <%= render 'form' %> 

users / edit.html.erb

 <h2>Edit user</h2> <%= render 'form' %> 

users_controller.rb

 class UsersController < ApplicationController before_filter :find_user, only: [:show, :edit, :update, :destroy] def index @users = User.all end def show end def new @user = User.new end def create @user = User.new(user_params) if @user.save redirect_to @user else render 'new' end end def edit end def update if @user.update(user_params) redirect_to @user else render 'edit' end end def destroy @user.destroy redirect_to user_index_path end private def user_params params.require(:user).permit(:name, :address, :email, :phone, :state, :country) end def find_user @user = User.find(params[:id]) end end 

If you have the same view code for two or more methods, you must create a partial one and the same view code and visualize it in these methods. This is called the DRY principle in ruby ​​on rails.

+7
source

Source: https://habr.com/ru/post/988291/


All Articles