【问题标题】:rails 5.1: pass variable to partial through ajaxrails 5.1:通过ajax将变量传递给部分
【发布时间】:2017-05-14 15:11:55
【问题描述】:

我是 Rails 和实验的新手。在我设法做到this 之后,我现在正在尝试执行以下操作:

单击设置名称的链接时,应在同一页面上部分呈现其描述。我设法渲染了部分,但前提是我在其中放入了一些静态文本。出于某种原因,我无法传递 @fbs 变量,因此无法选择描述。我对其他类似问题尝试了许多不同的建议,但我真的不明白我应该怎么做。我正在使用 ruby​​ 2.4.0 和 rails 5.1

这是我的 _settingsfb.html.erb(它是 index.html.erb 的一部分,其中包含 Link_to)

<div class="container fluid">
  <div class="row">


    <!-- settings links -->
    <div class="col-md-4 ">
<div class="panel panel-default">
  <div class="panel-heading">
    <h3 class="panel-title">Settings</h3>
  </div>
  <div class="panel-body">
    <% @fbs.each do |fbs| %>
<ul>
      <li>  <%= link_to fbs.name, controller: 'settingsfb', action: 'show', id: fbs.id,remote: true %></li>
        </ul><% end %>
  </div>
</div>
</div>

    <!-- setting description -->

  <div class="col-md-4">
<div class="panel panel-default">
  <div class="panel-heading">
    <h3 class="panel-title">Description</h3>
  </div>
  <div class="panel-body">
    <div id="desc">
      <!-- here goes the description partial -->
    </div>
  </div>
</div>
</div>

这里设置fb_controller(相关部分)

class SettingsfbController < ApplicationController
  before_action :set_setting, only: [:show, :edit, :update, :destroy]

  # GET /settings
  # GET /settings.json
  def index
    @settings = Setting.all
    @fbs = Setting.where("Sns = 1")
  end



  # GET /settings/1
  # GET /settings/1.json
  def show
       respond_to do |format|
      format.js {render layout: false}
    end
  end

show.js.erb

$("#desc").html("<%= j render 'settingsfb/show' %>");

和 _show 部分

<%= @fbs.name %>

这是我点击链接时得到的结果

 Started GET "/settingsfb/show?id=1" for 127.0.0.1 at 2017-05-14 17:08:34 +0200
    Processing by SettingsfbController#show as JS
      Parameters: {"id"=>"1"}
      Setting Load (0.3ms)  SELECT  "settings".* FROM "settings" WHERE "settings"."id" = ? LIMIT ?  [["id", 1], ["LIMIT", 1]]
      Rendering settingsfb/show.js.erb
      Rendered settingsfb/_show.html.erb (2.6ms)
      Rendered settingsfb/show.js.erb (3.8ms)
    Completed 500 Internal Server Error in 6ms (ActiveRecord: 0.3ms)



    ActionView::Template::Error (undefined method `name' for nil:NilClass):
        1: <%= @fbs.name %>

    app/views/settingsfb/_show.html.erb:1:in `_app_views_settingsfb__show_html_erb___617047289144576595_70310163068960'
    app/views/settingsfb/show.js.erb:1:in `_app_views_settingsfb_show_js_erb___3755597588635490219_70310163079560'
    app/controllers/settingsfb_controller.rb:17:in `block (2 levels) in show'
    app/controllers/settingsfb_controller.rb:16:in `show'

有什么想法吗?

【问题讨论】:

  • 显示你的 :set_setting 方法
  • # Use callbacks to share common setup or constraints between actions. def set_setting @setting = Setting.find(params[:id]) end@AlexanderSvetly
  • 我已经尝试过,在控制器中的 show 操作开始时初始化 @fbs,但随后我的部分呈现“设置”而不是“设置 nr 1”(这将是 @ 的正确输出987654329@
  • 然后试试@fbs = Setting.find(params[:id])(在show方法的开头)
  • 这个似乎有效!谢谢!

标签: ruby-on-rails ajax


【解决方案1】:

您应该在显示操作后渲染之前初始化@fbs。所以在show方法的开头加上@fbs = Setting.find(params[:id])

【讨论】:

    【解决方案2】:

    错误表明没有@fbs 变量。您正在从 show.js.erb 视图调用 settingsFbShow 部分,但未传递任何变量。试试

    $("#desc").html("<%= j render 'settingsfb/show', locals: {fbs: fbs}  %>");
    

    然后在create.js.erb中

    <%= fbs.name %>
    

    【讨论】:

      猜你喜欢
      • 2013-09-10
      • 1970-01-01
      • 2013-01-16
      • 2011-06-09
      • 1970-01-01
      • 2013-03-05
      • 2015-04-28
      • 2016-05-08
      • 1970-01-01
      相关资源
      最近更新 更多