如何使用相同的表单在rails上的ruby中创建和编辑

时间:2015-06-01 04:54:09

标签: html ruby-on-rails ruby forms

我是红宝石的新手。我有相同的形式,但我需要它在需要时执行创建/更新。我现在的问题是,每当我调用编辑而不是编辑现有用户的详细信息时,我将获得一个包含已编辑详细信息的新用户。简单来说,我想每当我执行编辑时,都会调用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 %>

以下代码用于创建用户:

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

这是我的控制器:

      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

因为我是ruby的新手,所以我没有得到关于http请求在ruby中如何运行的确切细节。

1 个答案:

答案 0 :(得分:10)

用户/ _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 %>

用户/ new.html.erb

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

用户/ 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

如果您有两个或更多方法的相同视图代码,则应创建相同视图代码的部分视图代码并在这些方法中呈现它。这在ruby on rails上被称为 DRY 原则