我有2个型号。
Scoreboard Model : can have many teams
Team Model : belongs to Scoreboard
Teams has the follow columns:
name: string
win,loss,tie: integer
在Team#Index视图中,我有一个与记分板关联的所有团队的集合。同样在该页面上,我可以在每个团队对象的顶部渲染一个编辑表单,并通过ajax进行更新。以下是相关代码:
团队#Index查看:
<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
列。
修改表单:
<%= 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 %>
Team#updates Controller Method(由ajax重新加载新编辑的团队对象div):
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的团队#index视图中。 在团队#show视图中,我想只编辑没有ajax的团队名称。
到目前为止,这是团队#show视图的样子:
团队#show View
<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执行不同的响应代码?如果没有,当我在团队#show page?
上提交表单时,如何执行自定义更新代码?答案 0 :(得分:1)
我不确定您是否可以使用不同的respond_to,因为您只能在操作中重定向或呈现一次。
一种方法是创建一个新的路线/控制器方法来更新团队名称。
路由
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 :(得分:0)
是的,您可以通过检查请求类型或发送标记/关键字来检查渲染响应来执行此操作,我会这样做:
以编辑形式为请求参数添加hidden_field
,如:
<%= 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 %>
在显示页面中的名称编辑表单中为请求参数添加hidden_field
,如:
<%= 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