2017-04-22 39 views
0

我實現包含兩個提交按鈕如下一個Rails形式:導軌的form_for與多個提交按鈕具有PARAMS [:提交]返回nil

<%= f.submit 'Save and Add New Task' %> 
    <%= f.submit 'Save and Finish' %> 

這是處理該請求並指向右邊的代碼行動:

def create_split 
    byebug 
    define_task 
    respond_to do |format| 
     new_task = @task #saves in new_task the task created by the user 
     load_new_task_attributes #loads everything needed for generating a new form for creating new tasks in this split 
     opr = InstantiationOperator.find_by name: "split" 
     @operator = opr.name 
     @operator_id = opr.id 
     @iteration = Iteration.find(new_task.iteration_id) 
     @project = @iteration.project 
     @instances = @iteration.project.instances 
     @activity = Activity.find(task_activity_params[:activity_id]) 
     if new_task.save 
     if params[:newtask] 
      format.html {render :split, notice: 'Task successfully created. Go ahead and add a new one'} 
     elsif params[:finish] 
      format.html { redirect_to new_task.iteration, notice: 'Task successfully created.' } 
     end 
     else 
     format.html {render :split} 
     end 
    end 
    end 

雖然它總是去else塊。 我使用的是,發現params[:commit]變得nil

然後,我嘗試了不同的方法:

<%= f.submit 'Save and Add New Task', name: 'newtask' %> 
    <%= f.submit 'Save and Finish', name: 'finish' %> 

而且

if params[:newtask] 
     format.html {render :split, notice: 'Task was successfully created. Go ahead and add a new one'} 
    else 
     format.html { redirect_to new_task.iteration } 
    end 

再次,它只能前往else塊。 我使用byebug檢查了params[:newtask],它也有nil的值。

我相信它一定很簡單,但我還沒有在互聯網上發現任何相關的東西。

在此先感謝

編輯:

更多細節控制器:

class TasksController < ApplicationController 
    before_action :set_task, only: [:show, :edit, :update, :destroy] 

    def create_split 
    byebug 
    define_task 
    respond_to do |format| 
     new_task = @task #saves in new_task the task created by the user 
     load_new_task_attributes #loads everything needed for generating a new form for creating new tasks in this split 
     opr = InstantiationOperator.find_by name: "split" 
     @operator = opr.name 
     @operator_id = opr.id 
     @iteration = Iteration.find(new_task.iteration_id) 
     @project = @iteration.project 
     @instances = @iteration.project.instances 
     @activity = Activity.find(task_activity_params[:activity_id]) 
     if new_task.save 
     if params[:newtask] 
      format.html {render :split, notice: 'Task successfully created. Go ahead and add a new one'} 
     elsif params[:finish] 
      format.html { redirect_to new_task.iteration, notice: 'Task successfully created.' } 
     end 
     else 
     format.html {render :split} 
     end 
    end 
    end 


    private 
    # Use callbacks to share common setup or constraints between actions. 
    def set_task 
     @task = Task.find(params[:id]) 
    end 

    # Never trust parameters from the scary internet, only allow the white list through. 

    def task_params 
     params.require(:task).permit(:name, :description, :priority, :category, :status, :startDate, :comments, :TTC, :iteration_id,:instance_id, task_artifacts_attributes: [:id, :name, :description, :_destroy]) 
    end 

    #This is called before any task creation method is started 
    def define_task 
     @task = Task.new(task_params) 
     @task.endDate = calculate_endDate(@task) 
     @task.task_activities << TaskActivity.new(activity_id: task_activity_params[:activity_id], instantiation_operator_id: task_activity_params[:instantiation_operator_id]) 
     @task.task_actor_roles << TaskActorRole.new(task_role_id: task_actor_role_params[:task_role_id] , task_actor_id: task_actor_role_params[:task_actor_id]) 
    end 
end 

整體觀:

<ol class="breadcrumb"> 
    <li>1- Select project, iteration and operator</li> 
    <li class="active">2- Create task - split operator</li> 
    </ol> 

    <h1>New Task - Split Operator</h1> 

    <%= render 'task_form_header' %> 

    <p>Activity: <%= @activity.name %></p> 

    <div class="col-md-12"> 
    <%= form_for(@task, url: {action: 'create_split'}, html: {class: "task"}) do |f| %> 
     <div class="col-md-6"> <!-- this div will be closed inside the form fields partial !--> 
     <%= hidden_field :task_activity, :activity_id, :value => @activity.id %> 
     <%= hidden_field :task_activity, :instantiation_operator_id, :value => @operator_id %> 
     <%= hidden_field_tag :project, :project_id, :value => @project.id %> 
     <%= f.hidden_field :iteration_id, :value => @iteration.id %> 

     <div class="field form-group instance"> 
     <%= label_tag :instance, "Select an instance" %> 
     <%= f.select :instance_id,@instances.collect{ |i| [i.name, i.id ]}, {prompt: "Select"}, id: "new_task_instance", required: true, class: "form-control" %> 
     </div> 

     <div class="field form-group"> 
     <%= f.label :name %> 
     <%= f.text_field :name, class: "form-control" %> 
     </div> 

     <%= render 'form_fields', f: f %> 

     <div class="col-md-12 form-group"> 
     <%= f.submit 'Save and Add New Task', name: 'newtask', class: "btn btn-default submit-task" %> 
     <%= f.submit 'Save and Finish', name: 'finish', class: "btn btn-default submit-task" %> 
     <%= link_to 'Cancel', new_task_path, class: "btn btn-default" %> 
     </div> 
    <% end %> 


    </div> 
+0

也許你正在省略一段代碼?這應該以兩種方式工作。 –

+0

@SebastiánPalma更詳細的一段代碼:http://rubyfiddle.com/riddles/3b678/2 – Leandro

回答

0

讓你的表格是這樣

<% form_for(something) do |f| %> 
    .. 
    <%= f.submit 'Save and Add New Task' %> 
    <%= f.submit 'Save and Finish' %> 
    .. 
<% end %> 

你的控制器動作應該是這樣的代碼片段

def some_action 
    if params[:commit] == 'Save and Add New Task' 
     # your code goes here 
    elsif params[:commit] == 'Save and Finish' 
     # your code goes here 
    end 
end 

OR

如果您使用的名稱提交按鈕

<%= f.submit 'Save and Add New Task', name: 'newtask' %> 
<%= f.submit 'Save and Finish', name: 'finish' %> 

你的控制器動作應該是這樣的代碼片段

if params[:newtask] 
    # your code goes here 
elsif params[:finish] 
    # your code goes here 
end 
+0

我正在關注第二個選項。仍然不起作用。它爲params [:newtask]和params [:finish]返回一個零值。所以當我提交表單時,我得到錯誤:「ActionController :: UnknownFormat」。 – Leandro

+0

你可以請編輯你的問題與細節形式和控制器的行動,似乎你在respond_to塊有一些錯誤? –

+0

只是增加了更多的細節 – Leandro