【问题标题】:Rails doesn't render partial even though it says it hasRails 不渲染部分,即使它说它有
【发布时间】:2013-11-02 17:55:47
【问题描述】:

在有人将此标记为重复之前,我从上一个问题中被告知要针对此问题打开一个新问题。不幸的是,我上一个问题的解决方案不适用于这个问题。

我的 Rails 服务器说它已经在我的页面中呈现了我的部分内容,但内容不存在。 即使我使用 Chrome DevTools 检查页面上的元素,应该呈现的 div 也不存在。

编辑:将我所有的部分从 layouts 更改为 shared,尽管我没有在这里更改。

show.html.erb(有修复):

<% provide(:title, @user.name) %>
<% provide(:pagetitle, @user.name) %>

<%= render'layouts/relation' unless current_user?(@user)%>

<div id="stats">
    Player Statistics will appear here.
</div>

<div id="characters">
    Player Characters will appear here.
</div>

_relation.html.erb(部分):

<div id="relation">
    <% if current_user.friends?(@user) %>
        <%= render 'layouts/edit_relation', locals: { action: "rm-friend" } %>
    <% elsif current_user.req_friends?(@user) %>
        Friend Request Pending...
    <% elsif current_user.pend_friends?(@user) %>
        <%= render 'layouts/edit_relation', locals: { action: "add-friend" } %>
        <%= render 'layouts/edit_relation', locals: { action: "rej-friend" } %>
    <% else %>
        <%= render 'layouts/edit_relation', locals: { action: "req-friend" } %>
    <% end %>
</div>

_edit_relation.html.erb(偏中的偏):

<% case :action %>
    <% when "req-friend"%>
        <%= form_for(current_user.relation.build(character: @user.id, type: "freq"), remote: true) do |f| %>
            <div><%= f.hidden_field :character %></div>
            <div><%= f.hidden_field :type %></div>
            <%= f.submit "Add Friend", class: "btn btn-large btn-primary" %>
        <% end %>

    <% when "add-friend"%>
        <%= form_for(current_user.relation.build(character: @user.id, type: "friend"), remote: true) do |f| %>
            <div><%= f.hidden_field :character %></div>
            <div><%= f.hidden_field :type %></div>
            <%= f.submit "Accept Request", class: "submit" %>
        <% end %>

    <% when "rej-friend" %>
        <%= form_for(current_user.reverse_relation.find_by(owner: @user.id, type: "freq"), html: { method: :delete }, remote: true) do |f| %>
            <%= f.submit "Reject Request", class: "submit" %>
        <% end %>

    <% when "rm-friend"%>
        <%= form_for(current_user.reverse_relation.find_by(owner: @user.id, type: "friend"), html: { method: :delete }, remote: true) do |f| %>
            <%= f.submit "Remove Friend", class: "submit" %>
        <% end %>

<% end %>

我的服务器日志显示部分已渲染:

Started GET "/melv" for 127.0.0.1 at 2013-11-01 21:22:21 +0000
Processing by UsersController#show as HTML
  Parameters: {"name"=>"melv"}
  User Load (1.0ms)  SELECT "users".* FROM "users" WHERE "users"."remember_token
" = '35599bfa491cb6b5e10f164c0191d51cd773f173' LIMIT 1
  User Load (1.0ms)  SELECT "users".* FROM "users" WHERE "users"."name" = 'melv'
 LIMIT 1
  Relation Load (1.0ms)  SELECT "relations".* FROM "relations" WHERE "relations"
."owner" = $1 AND "relations"."character" = 1 AND "relations"."type" = 'friend'
LIMIT 1  [["owner", 2]]
  Relation Load (0.0ms)  SELECT "relations".* FROM "relations" WHERE "relations"
."owner" = $1 AND "relations"."character" = 1 AND "relations"."type" = 'freq' LI
MIT 1  [["owner", 2]]
  Relation Load (1.0ms)  SELECT "relations".* FROM "relations" WHERE "relations"
."owner" = $1 AND "relations"."character" = 2 AND "relations"."type" = 'freq' LI
MIT 1  [["owner", 1]]
  Rendered layouts/_edit_relation.html.erb (0.0ms)
  Rendered layouts/_relation.html.erb (14.0ms)
  Rendered users/show.html.erb within layouts/application (23.0ms)
  Rendered layouts/_shim.html.erb (0.0ms)
  Rendered layouts/_header.html.erb (1.0ms)
  Relation Load (1.0ms)  SELECT "relations".* FROM "relations" WHERE "relations"
."owner" = 1 LIMIT 1
  Rendered layouts/_aside.html.erb (4.0ms)
  Rendered layouts/_flash.html.erb (0.0ms)
Completed 200 OK in 299ms (Views: 290.0ms | ActiveRecord: 5.0ms)

有什么想法吗?

【问题讨论】:

  • 两个部分中的哪一个没有渲染?
  • 鉴于渲染 edit_relation 部分只需要 0.0 毫秒,我怀疑没有任何值与 case 语句匹配。你能检查一下这个部分的行动价值吗?
  • 部分 layouts/asidelayouts/flash 渲染得好吗?
  • @MarkoHiel,_edit_relation 没有渲染,@amine、asideflash 渲染得很好。

标签: ruby-on-rails erb


【解决方案1】:

这条线有问题

<% case :action %>

action 应该是一个局部变量,而不是符号。符号 :actionwhen 中的任何值都不匹配,因此 Rails 很快就通过了这个部分并且什么也没做。

要修复,请将其更改为

<% case action %>

除此之外,还有两点需要改进

  1. 如果不是布局的一部分,将部分放在layouts 下是不好的。 MarkoHiel 也提到了这一点。

  2. 视图中过多的逻辑使视图代码看起来很丑。

【讨论】:

  • 这不起作用。这会在 Users#show: undefined local variable or method 'action' for #&lt;#&lt;Class:0x74a76c8&gt;:0x31c1448&gt; 中引发 NameError
  • 1.尝试将 action 重命名为其他人,这也是 Rails 方法,可能名称冲突。 2.尝试注释掉该部分中的所有代码并在没有局部变量的情况下加载它。一步一步调试,你就知道问题出在哪里了。
  • 我将 action 重命名为 doaction 并引发了同样的错误。我取出所有逻辑并渲染了Accept Request 分支,它渲染得很好。我是否正确使用locals,还是有更好的方法?
  • 我修好了;显然你不能像我一样使用locals,我觉得这很奇怪:stackoverflow.com/a/4402766/2407183
  • 是的,这是正确的风格。如果渲染部分,我总是使用partial,并且之前从未使用过您的样式,它不使用partial,但仅使用模板名称,所以我不知道这会带来问题。
【解决方案2】:

它可能说渲染是因为代码被执行了,只是没有输出。您需要在 '

&lt;%= render'layouts/relation' unless current_user?(@user) %&gt;

【讨论】:

  • 这是我的一个大错误,抱歉。之前的问题已经为我解决了这个问题,但是当我复制并粘贴到这里时,我忽略了反映问题的变化。解决该问题的人告诉我发布一个新问题。
【解决方案3】:

我不知道这是否有帮助。但通常您不会将部分内容放入布局文件夹中。尝试创建一个新文件夹并从那里渲染它。

【讨论】:

  • 感谢您的提示,我已更改 (+1)
猜你喜欢
  • 2013-11-13
  • 1970-01-01
  • 2011-12-17
  • 2017-05-07
  • 2017-06-01
  • 2012-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多