如何在同一模型的Rails 4上的不同视图上更新不同的列?

时间:2016-05-03 09:05:54

标签: ruby-on-rails activerecord

我有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?

上提交表单时,如何执行自定义更新代码?

2 个答案:

答案 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