Javascript 刷新页面时覆盖所有部分的rails ajax
我对rails中ajax的简单示例进行了简单的修改: 我正在尝试创建一个用户显示视图,在该视图中,按下按钮即可创建新的帖子。这些帖子都列在同一显示页面的用户下方,并在创建时显示 这些帖子创建得很好,并且正确地显示在页面上,但是当我刷新页面时Javascript 刷新页面时覆盖所有部分的rails ajax,javascript,ruby-on-rails,ajax,Javascript,Ruby On Rails,Ajax,我对rails中ajax的简单示例进行了简单的修改: 我正在尝试创建一个用户显示视图,在该视图中,按下按钮即可创建新的帖子。这些帖子都列在同一显示页面的用户下方,并在创建时显示 这些帖子创建得很好,并且正确地显示在页面上,但是当我刷新页面时 @post = User.posts.build() 覆盖以前创建的所有帖子,并为每个帖子提供nul id。 另外,将create.js.erb放在views文件夹中是正确的,还是应该放在assets/javascripts文件夹中 这是我的档案:
@post = User.posts.build()
覆盖以前创建的所有帖子,并为每个帖子提供nul id。
另外,将create.js.erb放在views文件夹中是正确的,还是应该放在assets/javascripts文件夹中
这是我的档案:
用户控制器
def show
@user = User.find(params[:id])
@posts = Post.all
@post = @user.posts.build
end
def create
puts params[:post][:user_id]
@user = User.find(params[:post][:user_id])
puts @user
@post = @user.posts.build()
respond_to do |format|
if @post.save
format.html { redirect_to @post, notice: 'Post was successfully created.' }
format.js {}
format.json { render json: @post, status: :created, location: @post }
else
format.html { render action: "new" }
format.json { render json: @post.errors, status: :unprocessable_entity }
end
Rails.logger.info(@post.errors.inspect)
end
end
def index
@posts = Post.all
@post = Post.new
end
users/show.html.erb
<%= "user-id: #{@user.id}" %>
<ul id="posts">
<%= render :partial => @posts %>
</ul>
<%= form_for(@post, remote: true) do |f| %>
<%= f.hidden_field :user_id, :value => @user.id %>
<%= f.submit %>
<% end %>
<ul id="posts">
<% @posts.each do |post| %>
<li>
<%= post.id %>
</li>
<% end %>
</ul>
posts/_post.html.erb
<li><%= @post.id %></li>
posts/create.js.erb
$("<%= escape_javascript(render @post) %>").appendTo("#posts");
$(“”)。附加到(“#posts”);
是的,你是对的
create.js.erb
带有后缀erb
,以帮助您向其中添加代码ruby
在这个文件中编写代码,就像在viewhtml.erb
上使用语法编写javascript代码一样
<script>
$("<%= escape_javascript(render @post) %>").appendTo("#posts");
</script>
$(“”)。附件(“#posts”);
是的,你是对的
create.js.erb
带有后缀erb
,以帮助您向其中添加代码ruby
在这个文件中编写代码,就像在viewhtml.erb
上使用语法编写javascript代码一样
<script>
$("<%= escape_javascript(render @post) %>").appendTo("#posts");
</script>
$(“”)。附件(“#posts”);
找到了一个解决方法,避免使用“post partial”来显示较旧的帖子:
编辑:users/show.html.erb
<%= "user-id: #{@user.id}" %>
<ul id="posts">
<%= render :partial => @posts %>
</ul>
<%= form_for(@post, remote: true) do |f| %>
<%= f.hidden_field :user_id, :value => @user.id %>
<%= f.submit %>
<% end %>
<ul id="posts">
<% @posts.each do |post| %>
<li>
<%= post.id %>
</li>
<% end %>
</ul>
-
我不认为这是一个理想的解决方案,但它目前运行良好。找到了一个解决方法,避免使用“post partial”来显示较旧的帖子: 编辑:users/show.html.erb
<%= "user-id: #{@user.id}" %>
<ul id="posts">
<%= render :partial => @posts %>
</ul>
<%= form_for(@post, remote: true) do |f| %>
<%= f.hidden_field :user_id, :value => @user.id %>
<%= f.submit %>
<% end %>
<ul id="posts">
<% @posts.each do |post| %>
<li>
<%= post.id %>
</li>
<% end %>
</ul>
-
我认为这不是一个理想的解决方案,但目前效果很好。问题
partial呈现所有新帖子的原因是,在partial中使用的是实例变量@post
,而不是局部变量post
在userscoontroller#show
操作中,设置@post=@user.posts.build
。在分部中渲染
时,引用的是来自控制器并设置为新post的同一变量
似乎所有以前创建的帖子都被“空”掉了,但实际上只是你在不断地呈现一个新帖子,而不是现有的帖子
解决方案
您需要更新分部变量以使用局部变量,而不是实例变量
当您呈现这样的记录集合时,Rails会自动向您提供此局部变量
<%= render @user.posts %>
或者
<%= render partial: "posts/post", collection: @user.posts %>
未来如何避免
这是一个非常常见的错误,很容易被忽略
基于这个原因,我的建议是完全
资源
@post
,而不是局部变量post
在userscoontroller#show
操作中,设置@post=@user.posts.build
。在分部中渲染
时,引用的是来自控制器并设置为新post的同一变量
似乎所有以前创建的帖子都被“空”掉了,但实际上只是你在不断地呈现一个新帖子,而不是现有的帖子
解决方案
您需要更新分部变量以使用局部变量,而不是实例变量
当您呈现这样的记录集合时,Rails会自动向您提供此局部变量
<%= render @user.posts %>
或者
<%= render partial: "posts/post", collection: @user.posts %>
未来如何避免
这是一个非常常见的错误,很容易被忽略
基于这个原因,我的建议是完全
资源
posts/_post.html.erb
和posts/create.js.erb
移动到文件夹views/users
下,谢谢您的回复,你明白为什么我的帖子列表在刷新页面时都变成了Post.new吗?在posts\u controller/index上@Post=Post.new是什么意思?我已经删除了,因为这是一个错误,但是用户show视图仍然将每个帖子显示为post.new,而不是单独的帖子。我认为您应该将文件posts/_post.html.erb
和posts/create.js.erb
移动到文件夹views/users
下。非常感谢您的回答,我会将其作为一项规则,以避免部分中的实例变量。非常感谢您的回答,我将制定一条规则,避免在部分中使用实例变量