2016-05-03 11 views
0

私は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に異なる応答コードを実行できますか?そうでない場合は、チーム#ショーページでフォームを送信すると、カスタマイズされた更新コードを実行するにはどうすればよいですか?

答えて

1

アクションで1回のみリダイレクトまたはレンダリングできるのと異なるrespond_toを使用できるかどうかはわかりません。

1つのアプローチは、チーム名を更新するための新しいルート/コントローラメソッドを作成することです。

経路鑑み

resources :teams do 
    member { post 'update_name' } 
end 

show.html.erb

は、あなたが上記経路に投稿することができ、コントローラに、新しいルートのための方法を作成します。

<%= form_for @team, :url => update_name_team_path(@team) 

teams_controller

def update_name 
    @team = Team.find(params[:id]) 
    redirect_to team_path(@team) 
end 
+1

私の通常の更新方法は、本当に私はこのような何かを探していた雑然としています。 「投稿」は私のためには機能しません。私の意図は、既に作成された要素を編集して、 'patch'が私のために働くようにすることです。それは大丈夫ですか? – kpaul

+0

パーフェクト、確かに、あなたがモデルを更新しているときにそれを発見しておくべきでした。 'put'も動作します。 – margo

+0

別の質問をするかもしれませんが、putとpatchの違いは何ですか? – kpaul

0

はい、あなたが要求タイプをチェックしたりレンダリングするための応答をチェックするためのフラグ/キーワードを送信することにより、これを行うことができ、私はそれが好きだろう:

<%= 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" %> 
     <%= f.hidden_field :request, 'js' %> </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 %> 

を追加しますように編集フォームで要求のparamのためhidden_fieldを追加以下のようなショーのページで名前の編集フォームで要求PARAMため:

<%= 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" %> 
     <%= f.hidden_field :request, 'http' %> </div> 

     <div class="col-xs-1"> <%= f.submit "Update", :data => {:disable_with => "Saving..."}, class: "btn btn-primary" %></div> 

<% end %> 

Team#Update方法は次のようになります。

def update 
    @scoreboard = Scoreboard.find(params[:scoreboard_id]) 
    @team = @scoreboard.teams.find(params[:id]) 
    if @team.update_attributes(team_params) 
     redirect_to scoreboard_teams_path(@scoreboard) if params[:request] == 'http' 
     render "" if params[:request] == 'js' 
    else 
     redirect_to scoreboard_teams_path(@scoreboard) if params[:request] == 'http' 
     render action: "update_error" if params[:request] == 'js' 
    end 
end 
関連する問題