如何将自定义功能分配给formtastic行动?

时间:2012-04-26 16:39:24

标签: ruby formtastic

我的表格:

<%= semantic_form_for(@campaign) do |f| %>
...
  <%= f.actions do %>
    <%= f.action :submit, label: "Save"%>
    <%= f.action :submit, label: "Save & New" %>
    <%= f.action :cancel, label: "Cancel"%>
  <% end %>
<% end %>

campaign_controller.rb中的功能:

  def save_and_new
    print 'SAVE_AND_NEW'
    @campaign = Campaign.find(params[:id])

    respond_to do |format|
      if @campaign.update_attributes(params[:campaign])
        format.html { redirect_to new_campaign_path, notice: 'Campaign was successfully usaved.' }
        format.json { head :no_content }
      else
        format.html { render action: "edit" }
        format.json { render json: @campaign.errors, status: :unprocessable_entity }
      end
    end
  end

routes.rb中:

  resources :campaigns do 
    member do
      post 'save_and_new'
    end
  end

路线,根据功能:

save_and_new_campaign POST   /campaigns/:id/save_and_new(.:format) campaigns#save_and_new

我唯一不理解的是,在操作中要写这个函数。

1 个答案:

答案 0 :(得分:2)

我不确定你要对save_and_new动作做什么,但我可以告诉你为什么你没有触发它。

默认情况下,您使用semantic_form_for使用formtastic创建的表单将使用RESTful约定来命中create操作以获取新记录,而update操作则使用create操作现有记录。如果您使用第一个提交按钮(标记为“保存”)成功点击了update / params[:commit]操作,但是您希望第二个“保存和新建”按钮执行不同的操作,那么您将需要检查控制器中def create if params[:commit] == "Save" # code for handling "Save" scenario else # code for handling "Save & New" scenario, perhaps even directly call: save_and_new end end def update if params[:commit] == "Save" # code for handling "Save" scenario else # code for handling "Save & New" scenario, perhaps even directly call: save_and_new end end 的值以分叉您对提交的处理。也许一些代码会更清楚。假设您正在提交更新现有记录:

save_and_new

同样,我不清楚你要用params[:commit]动作完成什么,并质疑这个假设可能会让你走上更好的设计之路,但要回答你当前的问题:检查createupdate中{{1}}的值应该会让您走上正轨。