【问题标题】:Multiple update forms for one model一个模型的多个更新表格
【发布时间】:2014-06-08 11:42:53
【问题描述】:

我想在一页上有多个表单。让我们做一个例子来理解我想要什么:

我有一个管理员页面,假设它是admins#show 页面。我的管理员必须在此页面的一个表格上更改他的名字,在另一个表格上更改他的年龄。我知道我可以创建一个表单,但我想要多个表单(因为这只是一个示例)。所以我的admins#show 页面看起来像这样:

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

但是在我的控制器中,我真的不知道它是如何工作的,这是我的问题。我想我有这样的东西,但是如何在更新方法中划分表单输入?:

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

【问题讨论】:

    标签: ruby-on-rails forms actioncontroller


    【解决方案1】:

    这有点非正统你在做什么,但你坚持只是一个例子,我想你可以处理update 这样做的方法

    def update
      @admin= Admin.find(params[:id])
      if params[:commit] == "Submit name change"
        if @admin.update_attributes(admin_params1)
          redirect_to @admin
        else
          render 'edit'
        end
      elsif params[:commit] == "Submit age change"
        if @admin.update_attributes(admin_params2)
          redirect_to @admin
        else
          render 'edit'
        end
      end
    end
    

    注意:未经测试!

    【讨论】:

    • 请注意,:commit 是按钮名称。我这么说是因为我在 10 分钟内无法弄清楚它是什么:D
    【解决方案2】:

    好吧,我认为您可以在控制器中创建其他非 REST 方法,然后在 config/routes 中添加命名路由,然后添加类似于此的两种不同形式;

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

    然后是这样的;

    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
    

    ** 未测试错误

    【讨论】:

      猜你喜欢
      • 2017-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多