私は2つのモデルを持っています。同じモデルに対してRails 4の異なるビューで異なる列を更新するにはどうすればいいですか?
Scoreboard Model : can have many teams
Team Model : belongs to Scoreboard
Teams has the follow columns:
name: string
win,loss,tie: integer
チーム#インデックスビューでは、すべてのチームがスコアボードに関連付けられています。また、そのページでは、各チームオブジェクトの上に編集フォームをレンダリングし、ajaxを使用してそのフォームオブジェクトを更新することができます。
チーム#インデックスビュー:ここでは、関連するコードがある
<div class="team-list">
<%= render @teams.reject(&:new_record?) %>
</div>
_team.html.erb
<div class="row team-div" id="team_<%=team.id%>">
<%= link_to (scoreboard_team_path(@scoreboard, team)) do %>
<div class="col-xs-4 team-div-1"> <%= team.name %> </div>
<% end %>
<%= link_to (edit_scoreboard_team_path(@scoreboard, team)), remote: true, class: "team-edit-link" do %>
<div class="col-xs-6 team-data">
<div class="row">
<div class="col-xs-4 team-div-2"><%= team.win %> </div>
<div class="col-xs-4 team-div-2"><%= team.loss %> </div>
<div class="col-xs-4 team-div-2"><%= team.tie %></div>
</div>
</div>
<% end %>
</div>
あなたが見ることができるように、私は利用できる編集リンクを持っていますajaxによって問題のteam object
の代わりに編集フォームを表示します。編集フォームはwin,loss,tie
列のみを更新します。レンダリング
編集フォーム:(AJAXによって新しく編集されたチームのオブジェクトのdivを再ロード)
<%= form_for [@scoreboard, @team], remote: true do |f| %>
<div class="row team-edit-form">
<div class="col-xs-4 edit-team-1">Placeholder</div>
<div class="col-xs-2 edit-team-2"><%= f.number_field :win, min: 0, max: 9999, class: "form-control", placeholder: "0" %></div>
<div class="col-xs-2 edit-team-2"><%= f.number_field :loss, min: 0, max: 9999, class: "form-control", placeholder: "0" %></div>
<div class="col-xs-2 edit-team-2"><%= f.number_field :tie, min: 0, max: 9999, class: "form-control", placeholder: "0" %></div>
<div class="col-xs-2 edit-team-3"> <%= f.submit "Done", :data => {:disable_with => "Saving..."}, class: "btn btn-primary" %></div>
</div>
<% end %>
チーム#更新コントローラ方法:私の問題のために今
def update
@scoreboard = Scoreboard.find(params[:scoreboard_id])
@team = @scoreboard.teams.find(params[:id])
if @team.update_attributes(team_params)
respond_to do |format|
format.html {redirect_to scoreboard_teams_path(@scoreboard)}
format.js
end
else
respond_to do |format|
format.html {redirect_to scoreboard_teams_path(@scoreboard)}
format.js { render action: "update_error" }
end
end
end
。上のすべてはajaxによるチーム#インデックスビューで発生します。 チーム#showビューでは、ajaxのないチーム名のみを編集したいと思います。
これまでのところ、これはチームの#ショーのビューは次のようになります。
チーム#ショービュー提出の際
<h3> <%= @team.name %> <h3>
<%= form_for [@scoreboard, @team] do |f| %>
<div class="col-xs-4"><%= f.text_field :name, required: true, maxlength: 30, class: "team-name-field form-control", placeholder: "Enter name" %></div>
<div class="col-xs-1"> <%= f.submit "Update", :data => {:disable_with => "Saving..."}, class: "btn btn-primary" %></div>
<% end %>
、私は名前を更新してから、ページをリダイレクトしたいと思いますチーム#show(ajaxは必要ありません)に戻ります。現在、このフォームは同じ更新メソッドにもルーティングされます。同じ更新方法を使用することは可能ですが、チーム#show viewに異なる応答コードを実行できますか?そうでない場合は、チーム#ショーページでフォームを送信すると、カスタマイズされた更新コードを実行するにはどうすればよいですか?
私の通常の更新方法は、本当に私はこのような何かを探していた雑然としています。 「投稿」は私のためには機能しません。私の意図は、既に作成された要素を編集して、 'patch'が私のために働くようにすることです。それは大丈夫ですか? – kpaul
パーフェクト、確かに、あなたがモデルを更新しているときにそれを発見しておくべきでした。 'put'も動作します。 – margo
別の質問をするかもしれませんが、putとpatchの違いは何ですか? – kpaul