Неопределенная локальная переменная в форме рельсов

Изменить: Оказывается, это действительно проблема синтаксиса при использовании render для частичных файлов. Должно быть render partial:


Я следую этому руководству по публикации в блоге, чтобы реализовать гем actions_as_commentable_with_threading. http://twocentstudios.com/blog/2012/11/15/simple-ajax-comments-with-rails/

У меня есть character модель со следующей частичной формой комментариев в show.html.haml представлении.

Эта строка дает мне неопределенную локальную переменную или метод для 'комментария'

app / views / characters / show.html.haml

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

Мне показалось, что хеш внутри хеша locals не подходит, поэтому я изменил локальную переменную comment на :comment. Это сработало нормально, но я не верю, что я должен это делать.

Когда я это делаю, визуализируемый фрагмент формы также использует локальную переменную comment.

app / views / comments / _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 

person ahnbizcad    schedule 03.06.2014    source источник
comment
Вы забыли добавить: перед комментарием. Попробуйте вот так: = render 'comments/form', :locals => { :comment => @new_comment }   -  person cristian    schedule 03.06.2014
comment
Привет, спасибо за комментарий. Как объяснено в OP, я пробовал это. Как вы думаете, что мне следует делать с последующими возникающими проблемами? Я не могу simple_form_for comment. Если я сделаю simple_form_for :comment, то comment.commentable_type не будет работать. превращение этого в символику тоже не сработает.   -  person ahnbizcad    schedule 03.06.2014
comment
:locals => { :comment => @new_comment } определенно является правильным синтаксисом, но был ли @new_comment определен? Если нет, то в форме локальная переменная comment будет установлена ​​в nil.   -  person Max Williams    schedule 03.06.2014
comment
Символ может немного сбивать с толку: причина в том, что вы устанавливаете переменную имя и переменную значение. Символ предназначен для имени и указывает на значение, которое нужно присвоить этой переменной.   -  person Max Williams    schedule 03.06.2014
comment
Верно, это хеш, поэтому он должен быть символом или строкой, а не локальной переменной. Можно ли использовать локальную переменную в качестве первого аргумента метода формы в форме? Если да, то как локальная переменная comment распознается в частичной форме? Включает ли использование совпадающего имени символа соответствующую локальную переменную?   -  person ahnbizcad    schedule 03.06.2014
comment
Действительно, @new_comment не устанавливается. В контроллере charcters - ›show action строка @new_comment = Comment.build_from(@character, current_user, ""), как сказано в руководстве github readme, и в руководстве, которое я связал в OP, но, по-видимому, он не работает. (current_user взят из devise gem) github.com/elight/acts_as_commentable_with_threading   -  person ahnbizcad    schedule 03.06.2014
comment
причина в том, что вы устанавливаете имя переменной и значение переменной. Это означает, что символ в этом методе приводит к созданию локальной переменной соответствующей строки (т. Е. Комментария) - правильно ли я вас понимаю? Возможно, я упустил именно то, что вы имели в виду. Если да, то я по ошибке задал вопрос, на который вы уже ответили.   -  person ahnbizcad    schedule 03.06.2014
comment
Вы можете сделать render @comments и посмотреть, какой части он ожидает   -  person Pierre-Louis Gottfrois    schedule 03.06.2014


Ответы (1)


В вашем контроллере:

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

Предполагая, что существует has_many отношение между character и comment.

На ваш взгляд:

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

or

render 'comments/form', new_comment: @new_comment

В вашем частичном:

= simple_form_for new_comment, remote: true do |f|
person Pierre-Louis Gottfrois    schedule 03.06.2014