1

Ruby on Railsの新機能です。今私は簡単なToDoリストアプリをブートストラップで作ろうとしています。Railsはブートストラップモーダルで新しいフォームと編集フォームを追加します

すべて動作しますが、新しいタスクフォームをモーダルウィンドウにレンダリングしようとしましたが、クラッシュしました。ここに私の_form部分のコードは次のとおりです。

<div id="myModal" class="modal fade" role="dialog"> 
    <div class="modal-dialog"> 
     <!-- Modal content--> 
     <div class="modal-content"> 
     <div class="modal-header"> 
      <button type="button" class="close" data-dismiss="modal">&times;</button> 
      <h4 class="modal-title">Modal Header</h4> 
     </div>  
     </div> 
     <div class="modal-body"> 
      <h1>New Task</h1> 
      <%= form_for @task, :html => {class:"form-horizontal"} do |f|%> 
      <!-- Here is form code --> 
      <% end %> 
      <%= link_to 'Back', tasks_path %> 
     </div> 
     <div class="modal-footer"> 
      <button type="button" class="btn btn-default" data-dismiss="modal">Close</button> 
     </div> 
     </div> 
    </div> 

そして、ここでは私のIndex.html.erbです:

<div class="container-fluid"> 
    <div class="row"> 
     <h1 class="text-left">Task List</h1> 
     <%= button_to 'New Task', new_task_path, :class =>"btn btn-success pull-right", :method => "get", data: {'data-toggle' => "modal", 'data-targe' => "#myModal"} %> 
    </div> 
    <div class="row button-margin "> 
    <% @tasks.each do |task| %> 
      <div class="panel <%= task_status(task) %>"> 
       <div class="panel-heading"> 
        <%= task.title %> 
        <p class="pull-right"><%= task.dueDate %></p> 
       </div> 
       <div class="panel-body">  
        <h3><%= task.body %></h3> 
       </div> 
      </div> 
     <% end %> 
    </div> 

    <%= render "tasks/form" %> 
</div> 

私のインデックスページを起動しようとするので、私はエラーFirst argument in form cannot contain nil or be emptyを取得します。

私のコードで何が間違っていますか?そして、既存のタスクを編集アクションのフォームにどのように渡すことができますか?

UPD:タスクコントローラの新しいタスクの

方法は次のとおりです。で

class TasksController < ApplicationController 
    def index 
     @tasks=Task.all 
    end 

    def new 
     @task=Task.new 
    end 

    def show 
     @task=Task.find(params[:id]) 
    end 

    def create 
     @task=Task.new(task_params) 
     if @task.save 
      redirect_to @task 
     else 
      render 'new' 
     end 
    end 

    private 
     def task_params 
      params.require(:task).permit(:title, :body, :creationDate, :dueDate) 
     end 
end 
+1

変更? –

+1

インデックスアクションに@task = Task.newも追加する必要があります。 – puneet18

+1

インデックスファイル内で新しいタスクフォームにアクセスしようとしているので、@task = Task.newはインデックスメソッドになければなりません。 –

答えて

1

@task変数あなたform_fornil[]することはできません。

あなたがRailsの振る舞いを「ハック」と明示的にこのようなあなたのフォームを宣言することができ

<%= form_for Task.new, :html => {class:"form-horizontal"} do |f| %> 
... 

しかし、あなたがwouldnので、それは、form_forを使用するために、またRailsのを使用するために「正しい」やり方ではないでしょうMVCパターンに従う必要があります。コントローラからビューへのインスタンス変数です。ビューには直接表示されません。

私はtasks_controllerにあなたの方法で何を見ることができないので、多分あなたはとしてそれを設定してみてください、あなたの@task変数にTask.new値を設定するのを忘れました:

class Task < ApplicationController 

    def index 
    @task = Task.new 
    ... 
    end 
end 

はそれがお役に立てば幸いです。

EDIT:インデックスファイル内の新しいタスクフォームにアクセスしようとしています。そのため、@task = Task.newはインデックスメソッドにある必要があります。

+0

Yeap、私のメソッドは現在\t def new @ task = Task.new end – Gleb

+0

です。したがって、問題に関連するファイルを質問に追加して詳細を確認してください。 –

1

エラーメッセージ最初の引数ie @taskがnilであることを指定します。

だからあなたのコントローラのコードは、あなたがあなたのtask_controller task_controllerに何があるか、より良い?、と言うん何

def index 
    @task = Task.new 
    @tasks = Task.all 
end 

def edit 
    @task = Task.find(params[:id]) 
end 
関連する問題