2013-07-03 59 views
0

當我在我的索引操作中添加一個模型時,會調用create操作,將模型的一個實例添加到數據庫中。這是下面的創建操作:添加到數據庫而不刷新頁面?

tracks_controller.rb

def create 
    @track = Track.new(params[:track]) 


    if @track.save 
     redirect_to(root_url) //Want to change this! 
    else 
     @tracks = Track.all 
     render :action=>"index" 
    end 
end 

在這裏你可以看到,我重定向到我的根URL(在這裏我想)每次創建時調用。但是,如何在不刷新頁面的情況下執行此操作?由於曲目正在播放,我不希望只要有東西添加到數據庫就刷新頁面。

如果我改變了行render :action=>"index",然後我收到我的index.html.erb文件

每個undefined method」下面的錯誤零:NilClass`

15: <p>Database is empty!</p> 
16: <%else%> 
17: <br> 
18: <% @tracks.each do |track| %> 
19: <div id="list_container"> 
20:  <ul> 
21:   <li class="list_container"> 

我如何去實現呢?

+0

添加新記錄的表單在索引頁中? – rmagnum2002

+1

Debadatt對你有一個很好的回答,但每次你添加一條新記錄時,它都會再次通過數據庫獲取所有記錄並顯示它們,而你可以使用ajax預先添加/附加最後一條創建的記錄這個清單,這樣會更快......如果不會有太多的記錄,你可以使用Debadatt例子。 – rmagnum2002

回答

1

形式

<%= form_for @track, remote: true %> 
    form fields 
    <%= f.submit %> 
<% end %> 

應用/視圖/音軌/ create.js.erb

<% if @track.valid? %> 
  $(".tracks").prepend('<%= j(render(@track)) %>'); // make sure you have _track.html.erb 
    $("ID OR CLASS OF YOUR FORM")[0].reset(); // this will clear your form inputs 
<% else %> 
    alert('Something Went Wrong'); 
<% end %> 

應用/視圖/音軌/ index.html.erb

<div class="tracks"> 
<% @tracks.each do |track| %> 
    <%= render :partial => 'track' %> 
<% end %> 
</div> 

應用程序/視圖/音軌/ _track.html.erb 這裏的一些代碼來顯示曲目:

<div>track.id</div> 
<div>track.name</div> 
+0

真的很紮實。謝謝。 – Louis93

1

index.html.erb需要@tracks變量。因此,您必須在渲染頁面之前設置它。

例如:

def create 
    @track = Track.create(params[:track]) 

    @tracks = Track.all 
    render :action => "index" 
end 
1

得到它是添加:remote => trueform_for的最簡單,最快捷的方法!

1

如果從一種形式張貼音軌,然後使遠程真 像

<%=form_for @track, :remote => true do |f| %> 
    your input fields 
    <%end %> 

index.html.erb

<div id="track_list"> 
<%= render :partial => 'tracks_record' %> 
</div> 

_tracks_record.html.erb

<% @tracks.each do |track|%> 
your code 
<% end %> 
在控制器

def create 
    @track = Track.create(params[:track]) 

    @tracks = Track.all 
    respond_to do |format| 
    format.js 
    end 
end 

創建create.js一個js.erb文件。erb

<% if @track.valid? %> 
('#track_list').html('<%= escape_javascript(render :partial => "tracks_record") %>'); 
<% else %> 
alert('Could not save'); 
<% end %> 

這將刷新數據並填充新條目而不刷新頁面。

+0

爲什麼每次添加新的記錄時都會渲染所有記錄?只是將創建的一個添加到現有列表中並不好多少​​? – rmagnum2002

+0

是的,這是一個很好的建議。 – Debadatt

0

不幸的是,我不能評論Debadatt的建議,但我發現它比頂部帖子好多了。我唯一的筆記來改變這

def create 
@track = Track.create(params[:track]) 

@tracks = Track.all 
respond_to do |format| 
    format.js 
end 
end 

這樣:

def create 
@track = Track.create(params[:track]) 

@tracks = Track.all 
respond_to do |format| 
    format.js { render layout: false, content_type: 'text/javascript' } 
end 
end 

而且這樣的:

('#track_list').html('<%= escape_javascript(render :partial => "tracks_record") %>'); 

這樣:

$('#track_list').html('<%= escape_javascript(render :partial => "tracks_record") %>'); 

偉大的建議感謝Debadatt