2

每次单击链接时,我都想刷新 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 %>

刷新.js.erb

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

教授控制器.rb

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

路线.rb

    resources :professors do
      get 'refresh'
    end
4

4 回答 4

1

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

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

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

于 2013-06-18T17:07:28.830 回答
0
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

意见/教授/refresh.html.erb

Hello "<%= @user %>"

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

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

聚苯乙烯

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

resourse :professors do
get 'refresh'
end
于 2013-06-17T16:14:41.080 回答
0

我不确定这是否是你想要做的,但使用 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 在那里工作。

为了使其超时,您需要通过设置与此处的答案类似的接受标头来使用带有 javascript 类型的 jquery ajax get jQuery ajax request not triggering JS response from rails controller?

于 2013-06-17T16:18:27.620 回答
0

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

在您的标记中没有任何地方定义一个id为的元素"profile",这#profile将是匹配的。你只定义了一个 div的"profile"

您的点击处理程序显示:

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

虽然您的间隔回调显示:

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

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

于 2013-06-17T17:24:06.243 回答