【问题标题】:Implementing ancestry on a nested resource throwing an error在嵌套资源上实现祖先引发错误
【发布时间】:2013-05-31 12:01:38
【问题描述】:

我正在嵌套资源上实现祖先。

resources :loads do
  resources :messages
end

这是我的索引操作

def index
  load = Load.find(params[:load_id])
  @messages = load.messages.scoped
  @message = load.messages.new
end

我的 index.html.erb 抛出以下错误。

缺少带有 {:locale=>[:en] 的部分消息/消息, :formats=>[:html], :handlers=>[:erb, :builder, :coffee]}。搜索: * "C:/Sites/final/cloud/app/views"

我的 index.html.erb 如下

<% title "Messages" %>

<%= nested_messages @messages.arrange(:order => :created_at) %>

<%= render "form" %>

这是我的nested_message 定义

module MessagesHelper
  def nested_messages(messages)
  messages.map do |message, sub_messages|
  render(message) + content_tag(:div, nested_messages(sub_messages), :class => "nested_messages")
   end.join.html_safe
  end
end

这是我的 _message.html.erb

<div class="message">
<div class="created_at"><%= message.created_at.strftime("%B %d, %Y") %></div>
<div class="content">
 <%= link_to message.content, message %>
</div>
<div class="actions">
<%= link_to "Reply", new_load_message_url(:parent_id => message) %> |
<%= link_to "Destroy", [message.load, message], :confirm => "Are you sure?", :method => :delete %>
</div>
</div>

任何帮助表示赞赏。

【问题讨论】:

    标签: ruby-on-rails ancestry


    【解决方案1】:

    此错误表明您的应用程序已尝试搜索部分 _messages.html.erb,因此该部分不得在您的 /app/views/messages 中,这会导致显示您的消息。检查你的messages 目录并检查你是否有这个部分。根据您的嵌套资源,我猜您在 LoadMessage 之间的关联是:

    class Load < ActiveRecord::Base
      has_many :messages
    end
    
    class Message < ActiveRecord::Base
      belongs_to :load
    end
    

    此外,我注意到您的index 操作中有以下行:@message = load.messages.new 这似乎不正确。因为您告诉您的应用程序要做的是当控制器收到响应以呈现index 操作时,它还应该通过执行@message = load.messages.new 创建消息,这就是它尝试呈现部分的原因。

    为您澄清一些事情。如果在您的应用程序中,您有一个 link_to 来创建一个新用户。单击新用户后,它将执行以下操作:

      def new
        @user = User.new
    
        respond_to do |format|
          format.html # new.html.erb
          format.json { render json: @user }
        end
      end
    

    并且会渲染 `app/views/users/new.html.erb 里面很可能有一个

    <%= form_for @user do |f| %>
      <%= render :partial => 'form', :locals => { :f => f } %>
    <% end %>
    

    这将调用您的部分,在正常情况下为_form.html.erb。当您尝试保存部分时,特定控制器的创建操作将发挥作用。通常,控制器的 create 块将如下所示:

     def create
        @title = "Create a user"
        @user = User.new(params[:user])
    
        if @user.save
          redirect_to usermanagement_path
          flash[:success] = "Created successfully."
        else
          @title = "Create a user"
          render 'new'
        end
      end
    

    create 操作中,当您提交_form.html.erb_message.html.erb 时,它将尝试通过params 传递用户来创建新用户。我完全相信您的问题很可能是:

    1) 你错过了你的 _message.html.erb

    2) 您还在 index 操作中调用 .new

    希望这可以为您解决这个问题。

    【讨论】:

    • 嗨,大卫。感谢您的详细回复。我的模型中有一个 _message.html.erb。我正在编辑我的帖子以包含此内容。我也尝试注释掉 .new 内部索引操作,但我得到了同样的错误
    • @user2297820 我刚刚在您提供的代码 sn-ps 中注意到的另一件事我看不到您在哪里调用&lt;%= render "message" %&gt;,您也可以尝试将扩展显式添加到&lt;%= render :partial =&gt; "messages/_message.html.erb"。你会注意到在你的index.html.erb 里面你正在打电话给&lt;%= render "form" %&gt; 我相信你想要&lt;%= render "message" %&gt; 如果我的立场是正确的
    • 感谢所有反馈的家伙。真的很感激。它现在正在工作。我的部分名称为 _messages.html.erb 而不是 _message.html.erb。再次非常感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多