一个模型的多个更新表单

时间:2014-06-08 11:42:53

标签: ruby-on-rails forms actioncontroller

我希望在一个页面上有多个表单。让我们举个例子来理解我想要的东西:

我有一个管理员页面,让我们说它是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

2 个答案:

答案 0 :(得分:3)

它有点非正统你正在做什么,但是当你坚持并且只有示例时,我想你可以处理<像这样做

的强> 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

注意:未经测试!

答案 1 :(得分: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

**没有测试错误

相关问题