【问题标题】:Rendering a partial after a successful form create with ajax使用ajax成功创建表单后渲染部分
【发布时间】:2016-11-09 03:33:23
【问题描述】:

我的控制器代码:

class HitChallengesController < ApplicationController

  def create
    game = Game.find(params[:id])
    suite_id = Suite.find_by(suite_number: params[:hit_challenge][:suite_id], game_id: game.id).id
    @hit_challenge = HitChallenge.new(game_id: game.id, suite_id: suite_id, title: params[:hit_challenge][:title])
    if @hit_challenge.save && request.xhr?
      respond_to do |format|
        format.json { render json: @hit_challenge}
      end
    else
      redirect_to games_show_path(game)
    end
  end
end

查看部分:

  <%if @game.has_hit_challenge %>
    <h4>Hit Challenges: </h4>

    <%if @hit_challenges.count > 1%>
      <% @hit_challenges.each do |h|%>
        <li>
        <%= "Suite #{h.suite.suite_number}, #{h.title}:" %>
        <%= link_to "Status", hit_status_path(h) %>
        <%= link_to "Play", play_hit_challenge_path(h) %>
        <%= form_for h, url: delete_hit_challenge_path(h), method: :delete do |f| %>
          <%= f.hidden_field :hit_challenge_id, value: h.id %>
          <%= f.submit "Delete" %>
        <%end%>
        </li>
      <%end%>
    <%else%>
      <li>
      <%= "Suite #{@hit_challenges.first.suite.suite_number}, #{@hit_challenges.first.title}:" %>
      <%= link_to "Status", hit_status_path(@hit_challenges.first) %>
      <%= link_to "Play", play_hit_challenge_path(@hit_challenges.first) %>
      <%= form_for @hit_challenges.first, url: delete_hit_challenge_path(@hit_challenges.first), method: :delete do |f| %>
        <%= f.hidden_field :hit_challenge_id, value: @hit_challenges.first.id %>
        <%= f.submit "Delete" %>
      <%end%>
      </li>
    <%end%>
  <%end%>

视图的其余部分:

<%if is_admin%>
  <div class='create-challenges'>
    <p>
      <%=form_for :suite, url: create_suite_path(:game_id => @game.id) do |f| %>
        <%= f.label 'Suite Number:' %>
        <%= f.text_field :suite_number %>
        <%=f.submit "Create" %>
      <%end%>
    </p>
    <p>
      <%=form_for :pitch_speed , url: create_pitch_speed_path(:game_id => @game.id) do |f|%>
        <%=f.label 'Create Pitch Speed Challenge' %>
        <%=f.select :suite_id, options_for_select(@game.suites.map {|s| s.suite_number}), {include_blank: 'Suite number?'} %>
        <%=f.label "Title:" %>
        <%=f.text_field :title %>
        <%=f.label "Min Speed:" %>
        <%=f.text_field :min_speed %>
        <%=f.label "Max Speed:" %>
        <%=f.text_field :max_speed %>
        <%=f.submit 'Create' %>
      <%end%>
    </p>
    <p>
      <%=form_for :prop_bet, url: create_prop_bet_path(:game_id => @game.id) do |f| %>
        <%= f.label 'Create Prop Bet:' %>
        <%= f.select :suite_id, options_for_select(@game.suites.map {|s| s.suite_number}), {include_blank: 'Suite number?'} %>
        <%= f.label "Title:" %>
        <%= f.text_field :title %>
        <%=f.submit "Create" %>
      <%end%>
    </p>
    <p>
      <%=form_for :hit_challenge, url: create_hit_challenge_path, :remote => true do |f| %>
        <%= f.label 'Create Hit Challenge:' %>
        <%= f.select :suite_id, options_for_select(@game.suites.map {|s| s.suite_number}), {include_blank: 'Suite number?'} %>
        <%= f.label "Title:" %>
        <%= f.text_field :title %>
        <%=f.submit "Create" %>
      <%end%>
    </p>
  </div>
  <%= link_to "Edit Game", games_edit_path(@game) %>
<div class='challenge-lists'>
  <div class='hit-list'>
    <%=render 'hit_challenges_list', locals: {@hit_challenges => @hit_challenges, @game => @game} %>
  </div>
  <div class='prop-list'>
  <%if @game.has_prop_bet%>

    <h4> Prop Bets:</h4>

    <%if @prop_bets.count > 1 %>
      <% @prop_bets.each do |prop| %>
        <li>
          <%= "Suite #{prop.suite.suite_number}, #{prop.title}:" %>
          <%=link_to "Status", prop_status_path(prop) %>
          <%=link_to "Play", show_prop_bet_path(prop) %>
          <%=link_to "Edit", edit_prop_path(prop) %>
          <%= form_for prop, url: delete_prop_bet_path(prop), method: :delete do |f| %>
            <%= f.hidden_field :prop_id, value: prop.id %>
            <%= f.submit "Delete" %>
          <%end%>
        </li>
      <%end%>
    <%else%>
      <li>
      <%="Suite #{@prop_bets.first.suite.suite_number}, #{@prop_bets.first.title}:" %>
      <%= link_to "Status", prop_status_path(@prop_bets.first) %>
      <%= link_to "Play", show_prop_bet_path(@prop_bets.first) %>
      <%=link_to "Edit", edit_prop_path(@prop_bets.first) %>
      <%= form_for @prop_bets.first, url: delete_prop_bet_path(@prop_bets.first), method: :delete do |f| %>
        <%= f.hidden_field :prop_id, value: @prop_bets.first.id %>
        <%= f.submit "Delete" %>
      <%end%>
      </li>
    <%end%>
  <%end%>
  </div>
  <div class='pitch-list'>
    <%if @game.has_pitch_speed %>
      <h4> Pitch Speed Challenges </h4>
      <%if @game.pitch_speeds.count > 1 %>
        <%@pitch_speeds.each do |pitch| %>
          <%= "Suite #{pitch.suite.suite_number}, #{pitch.title}:" %>
          <%=link_to "Play", play_pitch_speed_path(pitch) %>
        <%end%>
      <%else%>
        <%= "Suite #{@game.pitch_speeds.first.suite.suite_number}, #{@game.pitch_speeds.first.title}:" %>
        <%=link_to "Play", play_pitch_speed_path(@game.pitch_speeds.first) %>
      <%end%>
    <%end%>
  </div>
</div>
  <p>
    <li><%= link_to "Add Home Players", add_home_player_path(@game)%></li>
    <li><%= link_to "Add Away Players", add_away_player_path(@game)%></li>
  </p>
  <p>
    Total Hits:
    <%=form_for @game, url: update_game_hits_path do |f| %>
      <%=f.text_field :total_hits%>
      <%=f.submit "Update Hits" %>
    <%end%>
  </p>
<%end%>

最后是我的 js 文件:

$(document).ready(function(){
  $('.create-challenges').on('submit', function(e){
    e.preventDefault();
    $.ajax({
      url: $(this).attr('action'),
      method: $(this).attr('method'),
      data: $(this).serialize()
    }).done(function(response){
      data = '<%= j(render partial: "hit_challenges_list")%>';
      console.log(data);
      $(".hit-list li").append(data);

    }).fail(function(){
      console.log('you fail in life')
    })
  })

我正在尝试从该表单创建一个 hit_challenge,然后尝试将其附加到 hit_challenge 列表中,如上所示。部分本身可以正常工作,我可以看到 hit_challenges 没问题。

ajax 调用通过,记录已创建,但我无法弄清楚附加部分。我认为当我尝试将新创建的记录数据传递给部分时出现了问题......附加的是'',就像里面的 ruby​​ 代码不工作

会不会是我的偏心太多了?我尝试在 '' 中传递本地人,但没有任何区别。顺便说一句,我正在使用 rails 4。

编辑:

现在我遇到了一个奇怪的语法错误,我看不出部分有什么问题,我没有改变任何东西,它在那个 js 方法之外工作

SyntaxError(/Users/ddgs89/Desktop/Suite-Success/suite_success/app/views/games/_hit_challenges_list.html.erb:1:语法错误,意外'=',期待keyword_end ...tput_buffer = @output_buffer; = = local_assigns[:];;@输出... ... ^ /Users/ddgs89/Desktop/Suite-Success/suite_success/app/views/games/_hit_challenges_list.html.erb:1:语法错误,意外']',期待 tSTRING_CONTENT 或 tSTRING_DBEG 或 tSTRING_DVAR 或 tSTRING_END ...t_buffer; = = local_assigns[:];;@output_buffer = output_buf... ... ^): app/views/games/_hit_challenges_list.html.erb:1:语法错误,意外'=',期待keyword_end app/views/games/_hit_challenges_list.html.erb:1:语法错误,意外的“]”,需要 tSTRING_CONTENT 或 tSTRING_DBEG 或 tSTRING_DVAR 或 tSTRING_END app/views/hit_challenges/create.js.erb:9:in _app_views_hit_challenges_create_js_erb___1940717404351023775_70144770896860' app/controllers/hit_challenges_controller.rb:8:increate'

create.js.erb

$(document).ready(function(){
  $('.create-challenges').on('submit', function(e){
    e.preventDefault();
    $.ajax({
      url: $(this).attr('action'),
      method: $(this).attr('method'),
      data: $(this).serialize()
    }).done(function(response){
      data = '<%= j(render partial: "games/hit_challenges_list", locals: {@hit_challenges => @hit_challenges, @game => @game})%>';
      console.log(data);
      $(".hit-list li").append(data);

    }).fail(function(){
      console.log('you fail in life')
    })
  })
})

【问题讨论】:

    标签: jquery ruby-on-rails ajax render partials


    【解决方案1】:

    它不起作用,因为您试图在客户端进行服务器端渲染。一种方法是让您的控制器渲染部分并将其提供给客户端,但更好的方法和 Rails 方法是在您的 form_fors 上使用 remote: true 选项(不确定您是否发布了正确的视图作为create-challenges CSS 类不是您发布的形式)

    在您的创建操作中,您将拥有:

    def create
        game = Game.find(params[:id])
        suite_id = Suite.find_by(suite_number: params[:hit_challenge][:suite_id], game_id: game.id).id
        @hit_challenge = HitChallenge.new(game_id: game.id, suite_id: suite_id, title: params[:hit_challenge][:title])
        if @hit_challenge.save && request.xhr?
          respond_to do |format|
            format.json { render json: @hit_challenge}
            format.js
          end
        else
          redirect_to games_show_path(game)
        end
      end
    

    在你的 create.js.erb 中

    data = '<%= j(render partial: "games/hit_challenges_list")%>';
    console.log(data);
    $(".hit-list li").append(data);
    

    让我知道这是否有效或需要其他说明

    更新

    您的最终 create.js.erb 应该如下所示:

      data = '<%=j render(partial: "games/hit_challenges_list")%>';
      console.log(data);
      $(".hit-list li").append(data);
    

    您应该确保 @hit_challenges@game 在您的控制器中设置,我删除了传递给部分的实例变量,因为它是多余的,如果您将局部变量传递给部分,它必须是一个符号。

    【讨论】:

    • 抱歉,更新了帖子以显示整个视图。顺便说一句,我在表格上确实有'remote:true'。谢谢,我会在尝试代码后立即更新..
    • 酷。记得在 js.erb 文件中也将局部变量添加到部分
    • 现在我收到一个 500 服务器错误 ActionView::MissingTemplate (Missing template hit_challenges/create, application/create with {:locale=>[:en], :formats=>[:js, :html], :variants=>[], :handlers=>[:erb, :builder, :raw, :ruby, :coffee, :jbuilder]}。搜索到:*"/Users/ddgs89/Desktop/Suite- Success/suite_success/app/views" ): app/controllers/hit_challenges_controller.rb:8:in `create'
    • 我的js文件名是games_show.js,有问题吗?不是 js.erb 还有另外一个问题:为什么我们先做 format.json 再下一行 format.js?
    • hit_challenges_list 部分在哪里?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-29
    • 2016-04-24
    • 2022-08-19
    • 2016-06-19
    • 1970-01-01
    相关资源
    最近更新 更多