簡體   English   中英

js.erb文件由於無法從多個控制器傳遞局部變量而無法呈現局部

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM