【问题标题】:Ruby on Rails -- Updating partial with new values with javascript?Ruby on Rails -- 用 javascript 更新部分新值?
【发布时间】:2013-06-17 15:56:17
【问题描述】:

我想在每次点击链接时刷新 Rails 中的部分内容,但它似乎没有做任何事情。

有人能发现错误吗?

index.html.erb

<% @users.each do |u| %>
   <% if !u.nil? and u.department_id == department.id %>
      <%= link_to "#{u.first_name} #{u.last_name}", professor_refresh_path(u.id), remote: true %>
   <% end %> 
<% end %>
<div id="profile"></div>

_profile.html.erb

Hello, <%= user %>

refresh.js.erb

$('#profile').html('<%=j render partial: "/professors/profile", locals: {user: @user} %> ');

professors_controller.rb

    def refresh
      @user = @user + 1
        respond_to do |format|
          format.html
          format.js
      end
    end

routes.rb

    resources :professors do
      get 'refresh'
    end

【问题讨论】:

  • 是没有重新加载还是只是reloading the old value of the partial
  • @OldPro 它根本没有重新加载。 : (
  • 那它做了什么?
  • @NickGinanto 好吧,它现在什么也没做。我想要它做的是将 1 添加到用户变量,然后用新值刷新部分。但是,它根本没有加载,并且在我希望部分去的 index.html.erb 文件中没有显示任何内容。
  • 看我的回答,也许对你有一点帮助(等一下,我要先写出来)

标签: ruby-on-rails ruby


【解决方案1】:

首先,在您的 refresh.js.erb 中,您已将配置文件指定为类。它应该是一个ID。尝试使用

$('#profile').replaceWith("#{escape_javascript(render partial: 'professors/profile', locals: { user: @user })}"); 

因为@user 是刷新方法中唯一的实例变量。此外,从您在刷新方法中的代码来看,您似乎只是在更新计数。因此我的建议是用新值更新视图上的值,而不是替换整个部分。

【讨论】:

    【解决方案2】:
    def refresh
        @user = @user + 1
        render :partial => "/professors/profile"
      end
    

    据我所知,@user 在这里是未定义的,因为它类似于@user=nil+1

    从控制器你不能渲染部分。控制器可以响应查看文件。

    def refresh
        @user=User.find(params[:id]) #you need to take data from database
        @user = @user + 1
       respond_to do |format|
       format.html
       end
      end
    

    views/profesors/refresh.html.erb

    Hello "<%= @user %>"
    

    附:从视图中删除脚本并将它们添加到资产中的 proffesors.js 中,这是一种很好的做法。

    重写你的JS函数。从 html 文件中删除它,将 profile_links 类添加到这些链接中,并在 proffesors.js(在资产中):$('.profile_links).click(function() {$("#profle").load('professors/refresh.html'}

    P.P.S.

    另请注意,您应该将refresh 添加到您的路线中

    resourse :professors do
    get 'refresh'
    end
    

    【讨论】:

    • 感谢您的回答,但是当我点击链接时它仍然没有任何作用。
    【解决方案3】:

    这里没有什么大不了的,您的点击处理程序中有一个简单的错字,#profile 而不是.profile

    在您的标记中没有任何地方可以定义 id"profile" 的元素,这正是 #profile 将匹配的元素。您只需定义一个 class"profile" 的 div。

    您的点击处理程序显示:

    $('#profile').load('/professors/refresh');
    

    虽然您的区间回调显示为:

    $('.profile').load('/professors/refresh');
    

    其中一个永远不会起作用,根据您提供的标记,它是 #profile 一个在点击时运行。

    【讨论】:

    • 问题显然不仅仅出在这个错字上
    【解决方案4】:

    我不确定这是否是你想要做的,但使用 UJS 是做 partial 加载的 Rails 方式

    def refresh
        @user = @user + 1
    
     respond_to do |format|
      format.html
     format.js
    end
      end
    

    有一个 refresh.js.erb 并把它放在app/views/professors 里面有

    $('.profile').html('<%=j render partial: "/professors/profile", locals: {user: @user} %> ');
    

    您不必提供本地人,但它更易于维护。在这种情况下,将您的部分更改为

    Hello "<%= user %>"
    

    因为user 现在是局部变量中的局部变量,它的值是@user

    然后你可以让你的JS按钮与remote: true

    <%= link_to "#{u.first_name} #{u.last_name}", professors_refresh_path(u), remote: true %>
    

    只要确保路径没问题就行了

    这将调用 js 类型的刷新操作并触发 refresh.js.erb 使 js 在那里工作。

    要使其超时,您需要通过将接受标头设置为类似于此处的答案jQuery ajax request not triggering JS response from rails controller?

    ,从而使用带有 javascript 类型的 jquery ajax get

    【讨论】:

    • 我收到一个错误#:0x00000004d7f330> 的未定义方法 `professors_refresh_path'。我猜它与 routes.rb 文件有关?我该如何制定路线来匹配这个?
    • 在控制台中输入 rake routes 以查看刷新操作的路由。我想我打错字了,应该是profession_refresh_path(单数教授而不是复数)
    • 另外,正如乔的回答所说,确保有刷新操作的路线
    • 现在似乎又给了我一个错误。它说 #:0x000000047e2760> 的未定义局部变量或方法“用户”。
    • 确保包含 locals: {..} 部分。另外,我建议使用诸如 pry 之类的调试器,因为我无法逐个调试您的代码错误。要么,要么在此处显示您的整个相关代码,以便我查看
    猜你喜欢
    • 2012-07-07
    • 2014-01-02
    • 1970-01-01
    • 2014-04-14
    • 2017-07-19
    • 2019-04-30
    • 2018-07-24
    • 2017-06-14
    • 1970-01-01
    相关资源
    最近更新 更多