[英]js.erb files not rendering partials due to a failure to pass them locals from multiple controllers
我无法将本地人传递给由三个不同视图共享的局部视图,每个视图都与不同控制器中的不同操作有关。 使用html请求时,传递给它的partial和locals可以正常工作,但是发出xhr请求时,我无法使它们工作。 让我向您展示我的代码以更好地说明自己。
所以,我有这部分
# app/views/shared/_vote_form.html.erb
<div id="vote_form">
<% if post.votes.find_by(user_id: current_user.id).nil? %>
<%= render partial: "votes/vote", locals: { postv: post,
vote: post.votes.build } %>
<% else %>
<%= render partial: "votes/unvote", locals: { postu: post,
vote: post.votes.find_by(user_id: current_user.id) } %>
<% end %>
</div>
如您所见,此部分根据if
语句的结果呈现两个部分之一:
# app/views/votes/_vote.html.erb
<%= form_for([postv, vote], remote: true) do |f| %>
<%= hidden_field_tag 'vote[vote]', 1 %>
<%= f.submit "Vote", class: "btn" %>
<% end %>
# app/views/votes/_unvote.html.erb
<%= form_for([postu, vote], html: { method: :delete }, remote: true) do |f| %>
<%= f.submit "Unvote", class: "btn btn-primary" %>
<% end %>
正如我提到的,该部分由与不同控制器中不同动作相关联的三个不同视图共享。
# app/views/posts/show.html.erb
<div class="post-vote-form">
<%= render partial: "shared/vote_form", locals: { post: @post } %>
</div>
与以下控制器中的以下操作相关联:
class PostsController < ApplicationController
def show
@post = Post.find(params[:id])
end
end
另一种观点
# app/views/users/feed.html.erb
<% @feed_items.each do |f| %>
<div class="vote-button">
<%= render partial: "shared/vote_form", locals: { post: f } %>
</div>
<% end %>
与以下控制器关联
class UsersController < ApplicationController
def feed
@user = User.find_by(id: current_user.id)
@feed_items = @user.feed
end
end
最后
# app/views/categories/other.html.erb
<% @gal_items.each do |f| %>
...
<%= render partial: "shared/vote_form", locals: { post: f } %>
<% end %>
与controller#action关联
class CategoriesController < ApplicationController
def other
@other = Category.find(7)
@gal_items = @other.posts
end
end
如您所见,表单发送一个xhr请求来创建/销毁Vote的实例(我在Post
嵌套了Vote
路由。这就是form_for
需要两个参数的原因)。 这些请求由VotesController中的以下操作处理
class VotesController < ApplicationController
def create
@post = Post.find_by(id: params[:post_id])
@vote = @post.votes.build(vote_params)
@vote.user_id = current_user.id
@vote.save
respond_to do |format|
format.html { redirect_to @post }
format.js
end
end
def destroy
@vote.destroy
respond_to do |format|
format.html { redirect_to @post }
format.js
end
end
end
这两个js.erb
文件开始起作用:
# app/views/votes/create.js.erb
$("#vote_form").html("<%= escape_javascript(render :partial => 'votes/unvote', locals: { postu: @post,
vote: @post.votes.find_by(user_id: current_user.id)}) %>");
和
# app/views/votes/destroy.js.erb
$("#vote_form").html("<%= escape_javascript(render :partial => 'votes/vote', locals: { postv: @post.each,
vote: @post.votes.build }) %>");
我呈现这最后两个js.erb
文件的方式适用于视图js.erb
# app/views/posts/show.html.erb
因为当地人的值直接来自VotesController
动作,但我无法找到一种使它对呈现这些部分的其他两个视图( @something.each do |f|
)起作用的方法,因为我无法将适当的值传递给本地方法,以使form_for
参数起作用。 我已经尝试过使用一个帮助程序,根据URL将值传递给本地人,但没有成功。 似乎很明显,我无法获取这些js.erb
文件来为js.erb
提供具有适当值的js.erb
变量,因为我无法从它们各自的控制器中检索变量。
因此,最重要的是,是否有办法使其通过这些js.erb
文件工作,还是我必须使用纯JQuery来解决? 有没有人遇到过这样的事情? 很抱歉,我无法提出需要更具体答案的问题。 希望你们能提供帮助。
你有尝试过吗?
class UsersController < ApplicationController
def feed
@post = Post.find(params[:id])
@user = User.find_by(id: current_user.id)
@feed_items = @user.feed
end
end
class CategoriesController < ApplicationController
def other
@post = Post.find(params[:id])
@other = Category.find(7)
@gal_items = @other.posts
end
end
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.