Aks*_*hay 8 html ruby forms ruby-on-rails
我是红宝石的新手.我有相同的形式,但我需要它在需要时执行创建/更新.我现在的问题是,每当我调用编辑而不是编辑现有用户的详细信息时,我将获得一个包含已编辑详细信息的新用户.简单来说,我想每当我执行编辑时,都会调用create方法.
那么是否有任何方法可以使用单个表单进行新建和编辑,而不是使用单独的表单.
以下代码用于编辑用户详细信息:
<%= 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 %>
Run Code Online (Sandbox Code Playgroud)
以下代码用于创建用户:
<%= 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 %>
Run Code Online (Sandbox Code Playgroud)
这是我的控制器:
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
Run Code Online (Sandbox Code Playgroud)
因为我是ruby的新手,所以我没有得到关于http请求如何在ruby中运行的确切细节.
Vru*_*war 11
用户/ _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 %>
Run Code Online (Sandbox Code Playgroud)
用户/ new.html.erb
<h2>Create new user</h2>
<%= render 'form' %>
Run Code Online (Sandbox Code Playgroud)
用户/ edit.html.erb
<h2>Edit user</h2>
<%= render 'form' %>
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
如果您有两个或更多方法的相同视图代码,则应创建相同视图代码的部分视图代码并在这些方法中呈现它.这在轨道上的红宝石中称为干燥原理