添加到数据库而不刷新页面?

时间:2013-07-03 12:08:55

标签: ruby-on-rails ruby-on-rails-3

当我在索引操作中添加模型时,将调用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

在每次调用create时,你都可以看到我被重定向到我的根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">

我如何实现这一目标?

5 个答案:

答案 0 :(得分:1)

index.html.erb需要@tracks变量。因此,您必须在呈现页面之前进行设置。

例如:

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

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

答案 1 :(得分:1)

最简单,最快捷的方法是向您:remote => true添加form_for

答案 2 :(得分: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>

答案 3 :(得分:1)

如果您要从表单发布曲目,请将远程设置为true 像

<%=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.erb创建一个js.erb文件

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

这将刷新数据并填充新条目而不刷新页面。

答案 4 :(得分: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