4

このRailscastに従って、Ajax 経由でフォームを送信し、ページをリロードせずに div を更新しましたが、その一部に問題があります。

Ryan は、フォームが送信されたときに divを更新$("#products").html("<%= escape_javascript(render(@products)) %>");するファイルを持っています。のようなインスタンス変数が自分の状況に関連しているかどうか、または単純に URL に置き換えることができるかどうかを理解するのに苦労しています。index.js.erb#products@products

このスクリーンキャストで Ryan と同じことをしようとしていますが、検索結果を表示する代わりに、更新された値を表示したいだけです。

show.html.erb には次のものがあります。

<% @project.project_todos.order("created_at DESC").where(:status => false).each do |todo|%>

<%= form_for todo, :remote => true, :"data-replace" => "#dueon" do |f| %>
   <%= f.text_field :due %>
   <%= f.submit :class => "primary", :value => "Add" %>
<% end %>

<div id="dueon">
   <%= render "duedate", :todo => todo %>
</div>

<% end %>

パーシャル_duedate.html.erbには次の 1 行があります。<%= todo.due %>

したがって、私の index.js.erb には現在これがあります:$("#dueon").html("<%= escape_javascript(render("_duedate")) %>");しかし、明らかに機能していません。ここでの代わりに変数を使用する必要があり_duedateますか? もしそうなら、コントローラーでこれをどのように設定しますか?つまり、変数は何を表しているのでしょうか?

また、価値があるのは、パーシャルが正しくレンダリングされ、todo.due値が表示されていることです...フォームを送信しても更新されないだけです。

プロジェクトコントローラー:

def show
    @project = Project.find(params[:id])

    # Display the form to create a new todo
    @project_todo = ProjectTodo.new

    respond_to do |format|
      format.html # show.html.erb
      format.json { render :json => @project }
    end
  end
4

2 に答える 2

5

これを試して

あなたのコントローラーアクションで、(たとえばsample_action)

def sample_action
   @todos = #your code

   respond_to do |format|
      format.js
   end
end

そしてあなたはsample_action.js.erb

$("#dueon").html("<%= raw escape_javascript(render(:partial => 'duedate')) %>")

@todos次に、パーシャル内で、新しいインスタンス変数にアクセスできます

HTH

于 2012-12-17T06:43:13.453 に答える
0

セットアップ全体は少し変更する必要があると思うので、個別にお答えします(IMO、そうではないかもしれません)

プロジェクトが属するtodosコントローラーが必要だと思いますが、

--- モデル ----------------

class Project < ActiveRecord::Base
  has_many :todos
end

class Todo < ActiveRecord::Base
   belongs_to :project
end

---- ルート ---------------

resources :projects do
  resources :todos do
  end
end

---- コントローラー ----------

class ProjectsController < ApplicationController

終わり

class TodosController < ApplicationController

   def new
      @project = Project.find(params[:project_id])
      @todos = @project.todos.build
   end
end

ビューで (views/todos.html.erb)

<%= @project.name %>
<%= form_for([@Project, @todos]) do |f| %>
  #todo form code
<% end%>

関係によると、プロジェクトには多くの Todo があります。ユーザーがプロジェクト画面から新しい Todo を追加できるようにするのではなく、Todo 追加画面にプロジェクトの詳細を表示することは常に明確です。

繰り返しますが、これは私の個人的な見解です。質問はお気軽にどうぞ:)

于 2012-12-17T07:42:28.077 に答える