【问题标题】:Sidebar and rendering partial, trying to run a todo app on sidebar侧边栏和渲染部分,尝试在侧边栏上运行待办事项应用程序
【发布时间】:2016-07-06 23:45:08
【问题描述】:

我是 ruby​​ on rails 的新手,有人建议我使用侧边栏,以便在大多数页面上它会显示我想要的内容。我目前在自己的页面上有一个名为 Todo List 的应用程序。它只是让您创建任务并显示任务。它在自己的页面上运行。现在我想移动那个应用程序并让它在我的侧边栏中运行。我已经实现了我的侧边栏,如下所示。

/views/layouts/application (in body)
<%= yield :sidebar %>

/views/myapp1/index
<% content_for(:sidebar) do %>
 <% render :partial => "layouts/sidebar" %>
<% end %>


/views/layouts/_sidebar
 <% if logged_in? %>
  <div id="mySidenav" class="sidenav">

  <div class="row", id="container_todo_lists">
   <%= render @todo_lists %>
  </div>

  <div class="links" data-toggle="modal" data-target="#mynewtodo_list">
   <%= link_to('New Todo List', 'javascript:;', :id => :random) %>
  </div>

  <a href="javascript:void(0)" class="closebtn" onclick="closeNav()">×</a>
 </div>

<span style="font-size:30px;cursor:pointer" onclick="openNav()">☰ Todo List</span>
<script>
 function openNav() {document.getElementById("mySidenav").style.width = "250px";}

 function closeNav() {document.getElementById("mySidenav").style.width = "0";}
</script>

<% end %> 

<!-- Modal  create action -->
  <%= form_for(@todo_list, remote: true) do |f| %>
  <div class="modal fade" id="mynewtodo_list" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
    <div class="modal-dialog">
      <div class="modal-content">

        <div class="modal-header">
          <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
          <h4 class="modal-title" id="myModalLabel">Todo</h4>
        </div>

        <div class="modal-body">
          <div class="field">
            <%= f.label :title %><br>
            <%= f.text_area :title, class: "form-control todo_list_title" %>
          </div>
          <div class="field">
            <%= f.label :description %><br>
            <%= f.text_area :description, class: "form-control todo_list_content" %>
          </div>
        </div>

        <div class="modal-footer">
          <%= submit_tag "Create", class: "btn btn-primary" %>
          <button type="button" class="btn btn-default" data-dismiss="modal" id="mynewtodo_listclose">Close</button>
        </div>

      </div>
    </div>
    </div>
  <% end %>
<!-- Modal -->

我收到这个错误

 'nil' is not an ActiveModel-compatible object. It must implement :to_partial_path.

我想我知道部分问题是我的

@todo_lists

因为我试图在我的 todo_list 页面上调用侧边栏并且它可以工作,但是侧边栏搞乱了我原来的应用程序,所以当我按下编辑并显示它时,它会使屏幕变灰。非常感谢任何建议。提前致谢。

/views/todo_lists/_todo_list.html.erb
<div class="text-center" id="todo_list_<%= todo_list.id %>">

                <h3 class="panel-title"><%= todo_list.title %>
                  <sup style="color: #3BB2D6; position: absolute; top: 5px; right: 15px; text-align:right;">
                      (<%= time_ago_in_words(todo_list.created_at) %>)
                  </sup>
                </h3>

                <p><%= todo_list.description %></p>

                <div class="row" role="group">
                    <div class="links1" data-toggle="modal" data-target="#myupdatetodo_list_<%= todo_list.id %>">
                      <%= link_to('Edit', 'javascript:;', :id => :random) %>
                    </div>

                    <div class="links1" data-toggle="modal" data-target="#myitemtodo_list_<%= todo_list.id %>">
                      <%= link_to('Show', 'javascript:;', :id => :random) %>
                    </div>

                    <div class="links1">
                      <%= link_to 'Destroy', todo_list, method: :delete, remote: true %>
                    </div>

                </div>

        <!-- Modal - update posts -->
              <%= form_for(todo_list, :method => :put, remote: true) do |f| %>
              <div class="modal fade" id="myupdatetodo_list_<%= todo_list.id %>" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
              <div class="modal-dialog">
                <div class="modal-content">
                  <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
                    <h4 class="modal-title" id="myModalLabel">Edit</h4>
                  </div>
                  <div class="modal-body">

                  <div class="field">
                    <%= f.label :title %><br>
                    <%= f.text_area :title, class: "form-control" %>
                  </div>
                  <div class="field">
                    <%= f.label :description %><br>
                    <%= f.text_area :description, class: "form-control" %>
                  </div>

                  </div>
                  <div class="modal-footer">
                    <button type="button" id="myupdatebutton_<%= todo_list.id %>" class="btn btn-default" data-dismiss="modal">Close</button>
                    <%= submit_tag "Update", class: "btn btn-primary" %>
                  </div>
                </div>
              </div>
              </div>
              <% end %>
        <!-- Modal -->

        <!-- Modal - item posts -->
              <%= form_for(todo_list, :method => :put, remote: true) do |f| %>
              <div class="modal fade" id="myitemtodo_list_<%= todo_list.id %>" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
              <div class="modal-dialog">
                <div class="modal-content">
                  <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
                    <h4 class="modal-title" id="myModalLabel">Items</h4>
                  </div>
                  <div class="modal-body">



                  <h3><%= todo_list.title %></h3>
                  <p><%= todo_list.description %></p>



                  </div>
                  <div class="modal-footer">
                    <button type="button" id="myitembutton_<%= todo_list.id %>" class="btn btn-default" data-dismiss="modal">Close</button>
                    <%= submit_tag "Add Item", class: "btn btn-primary" %>
                  </div>
                </div>
              </div>
              </div>
              <% end %>
        <!-- Modal -->

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    在你的情况下,那是因为 @todo_lists 没有被设置,我敢肯定,如果你回到渲染视图的上一个 url,侧边栏会显示。

    一种解决方法是确保在每个页面上都这样设置:

    class ApplicationController
      before_action :set_to_do_lists
    
      def set_to_do_lists
        @todo_lists ||= TodoList.all #assign this to what's in your todo_lists_path
      end
    end
    

    我猜你的应用应该是固定的

    【讨论】:

    • 您也可以在方法中设置侧边栏所需的所有其他实例变量。不确定这是不是最好的方法。
    • 绕过了错误,但现在我得到了表单中的第一个参数不能包含 nil 或为空错误。它与“
    • 我认为你应该这样做
    • 效果很好!我可以看到侧边栏。但是由于某种原因,ajax 无法正常工作。我使用 ajax 填充描述和标题以弹出但现在它给了我一个没有弹出的灰色屏幕。有什么我想念的吗?
    • 我想我可以猜到它为什么会这样,但我不知道如何解决它。我的编辑 html 代码嵌套在 "
      " 中,因为它在我的 todo_list 文件夹中作为 _todo_list.html.erb 并且不知何故它没有运行代码。当我将上面列出的创建代码移动到嵌套的
      并且创建链接也给我一个灰屏时,我才发现它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-03
    • 2017-12-21
    • 1970-01-01
    • 2021-02-10
    • 2021-04-10
    相关资源
    最近更新 更多