Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rails error message - wrong number of arguments 2 for 1

I clicked the comment link (to post, not read, a comment) in the Enki blogging gem and it gave me this error message

ArgumentError in Posts#show

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

But I can't figure out what the two arguments are that it's sending. Note that I had already created one post with no comments on it.

This is the controller action show

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

this is the link I'm clicking in views/posts/index.html.erb to make a comment

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

This is the error message on the screen. Any suggestions how I might go about trying to figure out what's going on?

Rspec tests (Note, I haven't created any comments so I don't know why it's expecting one)

    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)>'

Error Message on localhost: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

Update

views/posts/show.html.erb (see the partial below)

  <% 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 -%>

partial rendered in app views posts show

<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 routes

  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"}
like image 796
Leahcim Avatar asked Oct 08 '22 15:10

Leahcim


1 Answers

As Azolo pointed out, Enki defines its own post_comments_path helper. The problem is Enki's doesn't take an options parameter like the Rails helpers do. So form_for ends up passing an option of :format => nil, expecting the Rails-style helper.

You can either fix this by adding options = {} to the end of Enki's post_comments_path, or by giving form_for an explicit URL:

form_for(@comment, :url => post_comments_path(@post), :method => :post)
like image 195
Dan Wich Avatar answered Oct 12 '22 12:10

Dan Wich