轨道形式的未定义局部变量

时间:2014-06-03 11:37:58

标签: ruby-on-rails forms ruby-on-rails-4 syntax simple-form

编辑: 事实证明,当使用render部分时,这确实是一个语法问题。它应该是render partial:


我正在关注此博客文章指南以实现acts_as_commentable_with_threading gem。 http://twocentstudios.com/blog/2012/11/15/simple-ajax-comments-with-rails/

我有一个character模型,show.html.haml视图中有以下评论表单部分。

这一行给了我一个未定义的局部变量或'comment'方法

应用/视图/字符/ show.html.haml

  ...
  = render 'comments/form', :locals => { comment => @new_comment }
  ...

本地哈希中的哈希似乎不对我,所以我将comment局部变量更改为:comment。这很好,但我不相信我应该这样做。

当我这样做时,渲染的表单部分也使用comment局部变量。

应用/视图/评论/ _form.html.haml

.comment-form
  = simple_form_for comment, :url => comment_path, :remote => true do |f|
    = f.error_notification
    = f.input :body, :input_html => { :rows => "3" }, :label => false
    = f.input :commentable_type, :as => :hidden, :value => comment.commentable_type
    = f.input :commentable_id, :as => :hidden, :value => comment.commentable_id
    = f.error :base
    = f.button :submit, :class => "btn btn-primary", :disable_with => "Submitting…"

请注意,传递给simple_form_for方法的对象也是局部变量。这也引发了一个错误,我也把它变成了一个符号。接下来,comment.commentable_type自然会引发错误,因为comment未定义。我无法将其转换为哈希,因为它正在对其进行方法调用,对吧?

无论问题的答案是什么,似乎我都是以错误的方式解决这个问题。当问题确实没有定义时,我不应该把事情变成符号。我应该在哪里定义它?我应该在哪里以及如何定义它?我试着在评论控制器中执行comment

我正在使用rails 4.0.0,使用简单的形式和haml。对于简单的表单,这可能是一个糟糕的语法吗?


编辑:这是第二行,使评论部分提升错误。 (所有被命名为评论的内容都很难说出它的来源。

  = render 'comments/form', comment: @new_comment
  = render 'comments/a_comment', collection: @comments, as: :comment


-# partial for a single comment.
%div.comment{ :id => "comment-#{comment.id}" }
  %hr
  = link_to "×", comment_path(comment), :method => :delete, :remote => true, :confirm => "Are you sure you want to remove this comment?", :disable_with => "×", :class => 'close'
  %h4
    = comment.user.username
    %small= comment.updated_at
  %p= comment.body
  %h4 

1 个答案:

答案 0 :(得分:1)

在您的控制器中:

def show
  @character = Character.find(params[:id])
  @new_comment = @character.comments.build
end

假设has_manycharacter之间存在comment关系。

在您看来:

render partial: 'comments/form', locals: { new_comment: @new_comment }

render 'comments/form', new_comment: @new_comment

在你的部分:

= simple_form_for new_comment, remote: true do |f|