2013-06-22 31 views
8

Tôi có trang tổng quan của người dùng ở bên trái có thanh bên có các liên kết như Dự án, Blog, v.v. Tôi muốn có thể nhấp vào liên kết như liên kết "Dự án" và sau đó trong khu vực chính, chế độ xem cho các dự án sẽ tải lên (xem sẽ là danh sách các dự án có dấu đầu dòng) mà không phải làm mới trang. Tôi đang cố gắng để làm điều này xảy ra với AJAX, nhưng mọi thứ không hoạt động.Gọi AJAX để hiển thị một phần trong Rails 3

Đây là cách tôi cho rằng nó hoạt động. Người dùng nhấp chuột vào liên kết bên trong show.html.erb

<%= link_to 'Projects', '/dash', remote: true %> 

nơi /dash được cấu hình để định tuyến cho người dùng # hiển thị trong file config/routes.rb như thế này:

match '/dash' => 'users#show' 

Và sau đó, hành động show được gọi trong users_controller.rb bộ điều khiển:

def show 
    @user = User.find(params[:id]) 
    @projects = @user.projects 

    respond_to do |format| 
     format.html # renders show.html.erb 
     format.js # renders show.js.erb 
    end 
end 

Nơi thực hiện show.js.erb. tập tin show.js.erb tôi có này một dòng:

$('#ajax').html("<%= escape_javascript(render(:partial => 'projects/index')).html_safe %>"); 

Và đó là nghĩa vụ phải sửa đổi div #ajax trong tôi show.html.erb:

<div id="ajax"> 
    <%= render :template => 'projects/index' %> 
</div> 

Các app/views/projects/index.html.rb mất trong @projects và đưa ra một danh sách, như thế này:

<% @projects.each do |project| %> 
    <p><%= project.name %></p> 
<% end %> 

Rõ ràng, tôi đang làm điều sai vì điều này không hoạt động. Tôi đang làm gì sai? Có một số mã tôi cần phải thay đổi ở nơi khác? Tôi đang ở trên Rails 3.2.13, do đó, các dòng //=jquery//=jquery_ujs dưới app/assets/javascripts/application.js đáng lẽ phải nhập chức năng jQuery và AJAX cần thiết.

Trả lời

11

Vấn đề là trong tệp show.js.erb bạn đang cố gắng hiển thị một phần nhưng bạn đang chuyển một tệp không phải là một phần. Các tệp một phần bắt đầu bằng dấu gạch dưới _.

Vì vậy, để tránh sao chép mã, đây là những gì tôi muốn làm:

# app/views/projects/show.js.erb 
$('#ajax').html("<%= escape_javascript(render :partial => 'index', :locals => { :projects => @projects }) %>"); 

# app/views/projects/index.html.erb 
<%= render :partial => 'index', :locals => { :projects => @projects } %> 

# app/views/projects/**_**index.html.erb 
# Include here the code that you previously had in index.html.erb 
# Don't forget to change @projects to projects 
<% projects.each do |project| %> 
    <p><%= project.name %></p> 
<% end %> 

Ngoài ra, bạn không nên sử dụng match trong tuyến đường của bạn, như bạn khá nhiều sẽ không bao giờ cần phải tuyến đường của bạn để có thể truy cập bằng cách cả hai phương thức GET và POST. Vì vậy, hãy thử sử dụng get thay vì match.

Các vấn đề liên quan