0

当我在索引操作中添加模型时,会调用创建操作,将模型的实例添加到数据库中。这是以下创建操作:

轨道控制器.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每个'对于 nil: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">

我该如何实现这一目标?

4

5 回答 5

1

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

例如:

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

  @tracks = Track.all   
  render :action => "index"
end
于 2013-07-03T12:15:35.037 回答
1

最简单,最快捷的获取方式就是添加:remote => true到你form_for

于 2013-07-03T12:26:42.563 回答
1

形式

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

app/views/tracks/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 %>

app/views/tracks/index.html.erb

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

app/views/tracks/_track.html.erb 这里有一些代码来显示轨道:

<div>track.id</div>
<div>track.name</div>
于 2013-07-03T12:31:46.857 回答
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 %>

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

于 2013-07-03T12:43:56.127 回答
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

于 2016-07-03T22:13:36.650 回答