【问题标题】:Rails error message - wrong number of arguments 2 for 1Rails 错误消息 - 参数数量错误 2 比 1
【发布时间】:2012-02-16 04:28:31
【问题描述】:

我点击了 Enki 博客 gem 中的评论链接(发布,而不是阅读,评论),它给了我这个错误消息

ArgumentError in Posts#show

wrong number of arguments (2 for 1)
Extracted source (around line #27):

但我无法弄清楚它发送的两个参数是什么。请注意,我已经创建了一篇没有 cmets 的帖子。

这是控制器动作展示

 def show
    @post = Post.find_by_permalink(*([:year, :month, :day, :slug].collect {|x| params[x] } << {:include => [:approved_comments, :tags]}))
    @comment = Comment.new
  end

这是我在 views/posts/index.html.erb 中单击以发表评论的链接

<li class="comments"><%= link_to(pluralize(post.approved_comments.size, "comment"), post_path(post, :anchor => 'comments')) %></li>

这是屏幕上的错误消息。有什么建议我可以尝试弄清楚发生了什么吗?

Rspec 测试(注意,我没有创建任何 cmets,所以我不知道它为什么需要一个)

    1) DeletePostUndo#process! creates a new post with comments based on the attributes stored in #data
         Failure/Error: new_post.comments.count.should == 1
           expected: 1
                got: 0 (using ==)
         # ./spec/models/delete_post_undo_spec.rb:11:in `block (3 levels) in <top (required)>'

   2) /posts/show.html.erb should render a post
     Failure/Error: render :template => "/posts/show.html.erb"
     ActionView::Template::Error:
       wrong number of arguments (2 for 1)
     # ./app/helpers/url_helper.rb:9:in `post_comments_path'
     # ./app/views/posts/show.html.erb:27:in `_app_views_posts_show_html_erb___532600282027141355_2210809080'
     # ./spec/views/posts/show.html.erb_spec.rb:45:in `block (2 levels) in <top (required)>'

本地主机上的错误消息:3000

ArgumentError in Posts#show

Showing /Users/mm/Sites/trenchstory/app/views/posts/show.html.erb where line #27 raised:

wrong number of arguments (2 for 1)
Extracted source (around line #27):

24:       <% end -%>
25:     </ul>
26:   </div>
27:   <% end -%>
28: <%= form_for([@post, @comment]) do |form| -%>
29:   <div>
30:     <p><%= form.text_field 'author' %><label for="comment_author"><small>Name or <a href="http://openidexplained.com/">OpenID</a> (required)</small></label></p>
Rails.root: /Users/mm/Sites/trenchstory

Application Trace | Framework Trace | Full Trace
app/helpers/url_helper.rb:9:in `post_comments_path'
app/views/posts/show.html.erb:27:in `_app_views_posts_show_html_erb___852287167798563826_2191478080'
Request

Parameters:

{"year"=>"2012",
 "month"=>"02",
 "day"=>"16",
 "slug"=>"my-first-post"}
Show session dump

_csrf_token: "OogtzfpSz3JylLAjvBdnBkn/Ti4RdAc+sbuGXeREqHA="
logged_in: true
session_id: "b045900073f1eed9a9880ff4ead34d07"
warden.user.user.key: ["User", [1], "$2a$10$9C.WngPResjBHCQ/vXK0JO"]
Show env dump

GATEWAY_INTERFACE: "CGI/1.1"
HTTP_ACCEPT: "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
HTTP_ACCEPT_CHARSET: "ISO-8859-1,utf-8;q=0.7,*;q=0.3"
HTTP_ACCEPT_ENCODING: "gzip,deflate,sdch"
HTTP_ACCEPT_LANGUAGE: "en-US,en;q=0.8"
REMOTE_ADDR: "127.0.0.1"
REMOTE_HOST: "activate.adobe.com"
SERVER_NAME: "localhost"
SERVER_PROTOCOL: "HTTP/1.1"
Response

Headers:

None

更新

views/posts/show.html.erb(见下部分)

  <% content_for(:head) do -%>
      <%= javascript_include_tag 'common' %>
      <%= javascript_include_tag 'live-comment-preview' %>
    <% end -%>
    <% content_for(:page_title) do -%>
    <%= post_title(@post) -%>
    <% end -%>
    <%= render :partial => 'posts/post', :locals => {:post => @post} %>
    <ol class="commentlist">
      <% @post.approved_comments.each do |comment| -%>
      <li<%=raw cycle(' class="alt"', '') %> id="comment-<%= comment.id %>">
        <%= render :partial => 'comments/comment', :locals => {:comment => comment} %>
      </li>
      <% end -%>
    </ol>
    <div class="related">Looking for more? Head on over to the <%= link_to("archives", archives_path) %>.</div>
    <h2>Post a comment</h2>
      <% unless @comment.errors.empty? -%>
      <div class="errors">
        <h3>Comment not added!</h3>
        <ul>
          <% @comment.errors.sort_by(&:first).each do |error| -%>
            <li><%= format_comment_error(error) %></li>
          <% end -%>
        </ul>
      </div>
      <% end -%>
    <%= form_for([@post, @comment]) do |form| -%>
      <div>
        <p><%= form.text_field 'author' %><label for="comment_author"><small>Name </small></label></p>
        <p><%= form.text_area 'body' %><br><small>(<a href="http://lesstile.rubyforge.org">lesstile enabled</a> - surround code blocks with ---)</small></p>
        <p><%= submit_tag "Add Comment" %></p>
      </div>
    <% end -%>

在应用视图帖子显示中部分呈现

<h2><%= link_to(post.title, post_path(post)) %></h2>
<div class="entrybody">
  <%=raw post.body_html %>
</div>
<div class="meta">
  <ul>
    <li class="date">Posted on <%= format_post_date(post.published_at) %></li>
    <li class="comments"><%= link_to(pluralize(post.approved_comments.size, "comment"), post_path(post, :anchor => 'comments')) %></li>
    <% unless post.tags.empty? -%>
    <li class="tags">Tagged <%= linked_tag_list(post.tags) %></li>
    <% end -%>
  </ul>
</div>

Rake 路线

  forem        /forums                                         {:to=>Forem::Engine}
        new_user_session GET    /users/sign_in(.:format)                        {:action=>"new", :controller=>"devise/sessions"}
            user_session POST   /users/sign_in(.:format)                        {:action=>"create", :controller=>"devise/sessions"}
    destroy_user_session DELETE /users/sign_out(.:format)                       {:action=>"destroy", :controller=>"devise/sessions"}
           user_password POST   /users/password(.:format)                       {:action=>"create", :controller=>"devise/passwords"}
       new_user_password GET    /users/password/new(.:format)                   {:action=>"new", :controller=>"devise/passwords"}
      edit_user_password GET    /users/password/edit(.:format)                  {:action=>"edit", :controller=>"devise/passwords"}
                         PUT    /users/password(.:format)                       {:action=>"update", :controller=>"devise/passwords"}
cancel_user_registration GET    /users/cancel(.:format)                         {:action=>"cancel", :controller=>"devise/registrations"}
       user_registration POST   /users(.:format)                                {:action=>"create", :controller=>"devise/registrations"}
   new_user_registration GET    /users/sign_up(.:format)                        {:action=>"new", :controller=>"devise/registrations"}
  edit_user_registration GET    /users/edit(.:format)                           {:action=>"edit", :controller=>"devise/registrations"}
                         PUT    /users(.:format)                                {:action=>"update", :controller=>"devise/registrations"}
                         DELETE /users(.:format)                                {:action=>"destroy", :controller=>"devise/registrations"}
           admin_session POST   /admin/session(.:format)                        {:action=>"create", :controller=>"admin/sessions"}
       new_admin_session GET    /admin/session/new(.:format)                    {:action=>"new", :controller=>"admin/sessions"}
      edit_admin_session GET    /admin/session/edit(.:format)                   {:action=>"edit", :controller=>"admin/sessions"}
                         GET    /admin/session(.:format)                        {:action=>"show", :controller=>"admin/sessions"}
                         PUT    /admin/session(.:format)                        {:action=>"update", :controller=>"admin/sessions"}
                         DELETE /admin/session(.:format)                        {:action=>"destroy", :controller=>"admin/sessions"}
     preview_admin_posts POST   /admin/posts/preview(.:format)                  {:action=>"preview", :controller=>"admin/posts"}
             admin_posts GET    /admin/posts(.:format)                          {:action=>"index", :controller=>"admin/posts"}
                         POST   /admin/posts(.:format)                          {:action=>"create", :controller=>"admin/posts"}
          new_admin_post GET    /admin/posts/new(.:format)                      {:action=>"new", :controller=>"admin/posts"}
         edit_admin_post GET    /admin/posts/:id/edit(.:format)                 {:action=>"edit", :controller=>"admin/posts"}
              admin_post GET    /admin/posts/:id(.:format)                      {:action=>"show", :controller=>"admin/posts"}
                         PUT    /admin/posts/:id(.:format)                      {:action=>"update", :controller=>"admin/posts"}
                         DELETE /admin/posts/:id(.:format)                      {:action=>"destroy", :controller=>"admin/posts"}
     preview_admin_pages POST   /admin/pages/preview(.:format)                  {:action=>"preview", :controller=>"admin/pages"}
             admin_pages GET    /admin/pages(.:format)                          {:action=>"index", :controller=>"admin/pages"}
                         POST   /admin/pages(.:format)                          {:action=>"create", :controller=>"admin/pages"}
          new_admin_page GET    /admin/pages/new(.:format)                      {:action=>"new", :controller=>"admin/pages"}
         edit_admin_page GET    /admin/pages/:id/edit(.:format)                 {:action=>"edit", :controller=>"admin/pages"}
              admin_page GET    /admin/pages/:id(.:format)                      {:action=>"show", :controller=>"admin/pages"}
                         PUT    /admin/pages/:id(.:format)                      {:action=>"update", :controller=>"admin/pages"}
                         DELETE /admin/pages/:id(.:format)                      {:action=>"destroy", :controller=>"admin/pages"}
          admin_comments GET    /admin/comments(.:format)                       {:action=>"index", :controller=>"admin/comments"}
                         POST   /admin/comments(.:format)                       {:action=>"create", :controller=>"admin/comments"}
       new_admin_comment GET    /admin/comments/new(.:format)                   {:action=>"new", :controller=>"admin/comments"}
      edit_admin_comment GET    /admin/comments/:id/edit(.:format)              {:action=>"edit", :controller=>"admin/comments"}
           admin_comment GET    /admin/comments/:id(.:format)                   {:action=>"show", :controller=>"admin/comments"}
                         PUT    /admin/comments/:id(.:format)                   {:action=>"update", :controller=>"admin/comments"}
                         DELETE /admin/comments/:id(.:format)                   {:action=>"destroy", :controller=>"admin/comments"}
    undo_admin_undo_item POST   /admin/undo_items/:id/undo(.:format)            {:action=>"undo", :controller=>"admin/undo_items"}
        admin_undo_items GET    /admin/undo_items(.:format)                     {:action=>"index", :controller=>"admin/undo_items"}
                         POST   /admin/undo_items(.:format)                     {:action=>"create", :controller=>"admin/undo_items"}
     new_admin_undo_item GET    /admin/undo_items/new(.:format)                 {:action=>"new", :controller=>"admin/undo_items"}
    edit_admin_undo_item GET    /admin/undo_items/:id/edit(.:format)            {:action=>"edit", :controller=>"admin/undo_items"}
         admin_undo_item GET    /admin/undo_items/:id(.:format)                 {:action=>"show", :controller=>"admin/undo_items"}
                         PUT    /admin/undo_items/:id(.:format)                 {:action=>"update", :controller=>"admin/undo_items"}
                         DELETE /admin/undo_items/:id(.:format)                 {:action=>"destroy", :controller=>"admin/undo_items"}
            admin_health        /admin/health(/:action)(.:format)               {:action=>"index", :controller=>"admin/health"}
              admin_root        /admin(.:format)                                {:controller=>"admin/dashboard", :action=>"show"}
                archives GET    /archives(.:format)                             {:action=>"index", :controller=>"archives"}
                    page GET    /pages/:id(.:format)                            {:action=>"show", :controller=>"pages"}
                         GET    /:year/:month/:day/:slug/comments(.:format)     {:year=>/\d{4}/, :month=>/\d{2}/, :day=>/\d{2}/, :controller=>"comments", :action=>"index"}
                         POST   /:year/:month/:day/:slug/comments(.:format)     {:year=>/\d{4}/, :month=>/\d{2}/, :day=>/\d{2}/, :controller=>"comments", :action=>"create"}
                         GET    /:year/:month/:day/:slug/comments/new(.:format) {:year=>/\d{4}/, :month=>/\d{2}/, :day=>/\d{2}/, :controller=>"comments", :action=>"new"}
                         GET    /:year/:month/:day/:slug(.:format)              {:year=>/\d{4}/, :month=>/\d{2}/, :day=>/\d{2}/, :controller=>"posts", :action=>"show"}
         formatted_posts GET    /posts.:format                                  {:controller=>"posts", :action=>"index"}
                   posts GET    /(:tag)(.:format)                               {:controller=>"posts", :action=>"index"}
                    root        /                                               {:controller=>"posts", :action=>"index"}

【问题讨论】:

  • 请显示app/views/posts/show.html.erb的来源
  • @taro 我更新了操作。谢谢。

标签: ruby-on-rails


【解决方案1】:

正如 Azolo 所指出的,Enki 定义了自己的 post_comments_path 助手。问题是 Enki 没有像 Rails 助手那样采用 options 参数。所以form_for 最终传递了:format =&gt; nil 的选项,期待Rails 风格的帮助器。

您可以通过在 Enki 的 post_comments_path 末尾添加 options = {} 来解决此问题,或者通过为 form_for 提供一个明确的 URL:

form_for(@comment, :url => post_comments_path(@post), :method => :post)

【讨论】:

  • 您的解决方案有效。我发布了 rake 路线,但另请参阅@Azolo 的回答。我不知道在协会中审查什么。 post有很多cmets,cmets属于post等。
  • 我已经找到了根本问题并通过几个修复更新了答案。
【解决方案2】:

所以我在看你的错误,这个错误突然出现在我身上。

app/helpers/url_helper.rb:9:in `post_comments_path'

我想也许你声明了那个助手,但实际上它实际上是在 Enki 中声明的,请查看:

def post_comments_path(post)
  post_path(post) + "/comments"
end

所以,这就是您收到该参数错误的原因。我不知道他们为什么会这样覆盖它,但他们做到了。
这是source on Github

【讨论】:

  • 所以该方法只接受一个参数,但发送了两个(第二个是一些评论对象?)? @Dan Wich 的解决方案实际上解决了这个问题,仅在我将 Enki 更新到 Rails 3.1(从 3.0.4)时发生。
  • 我真的无法告诉你更多关于它为什么会像以前那样工作而现在却不是这样的信息。我可以告诉你的是,大约一小时前enki 发生了合并,改变了方法。
猜你喜欢
  • 2012-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-24
  • 2015-04-26
相关资源
最近更新 更多