2015-05-19 3 views
0

Каждый пользователь has_many: уведомления и каждое уведомление has_many: комментарии, каждый из класса Notice. Каждое уведомление/комментарий has_one: суперноти, уведомление, по которому делается комментарий. Я получаю это сообщение об ошибке при попытке отправки комментария: undefined method 'id' for "#<Notice:0x0000010eed6958>":String. Почему Rails считает мой NoticeString?Rails: undefined method `id '

notices_controller.rb:

def create 
    @notice = user.notices.build(notice_params) 
    if @notice.save 
    if !params[:notice][:commentee].nil? 
     @notice.create_comment(params[:notice][:commentee]) 
    end 
    end 
end 

private 
    def notice_params 
    params.require(:notice).permit(:content, :comentee) 
    end 

notice.rb:

belongs_to :user 
has_one :active_comment_relationship, class_name: "Commentrelationship", foreign_key: "commenter_id", dependent: :destroy 
has_one :supernotice, through: :active_comment_relationship, source: :commentee 

def create_comment(other_notice) 
    active_comment_relationship.create(commentee_id: other_notice.id) 
end 

Чтобы оставить свой комментарий на уведомления в _notice.html.erb:

<%= form_tag({controller: "notices", action: "create"}, method: "post", id: "comment_form") do %> 
    <%= hidden_field_tag :callsign, @user.callsign %> 
    <%= hidden_field_tag "notice[commentee]", notice %> 
    <%= text_area_tag "notice[content]", '', id: "commentField" %> 
    <%= submit_tag "Reply" %> 
    <% end %> 

журналов сервера:

Parameters: {"utf8"=>"✓", "authenticity_token"=>"...", "callsign"=>"bazzer", "notice"=>{"commentee"=>"#<Notice:0x00000110a49140>", "content"=>"Hello there."}, "commit"=>"Reply"} 
+0

Вы не можете передать объект в params '<% = hidden_field_tag" уведомление [commentee] ", notice%>', '" commentee "=>" # <Примечание: 0x00000110a49140> "', он становится строкой. – roxxypoxxy

ответ

0

Потому что он может отображаться только в виде формы в виде строки. Сериализация его взад и вперед не принесет вам никакой пользы. Очевидный вариант будет проходить в id этого уведомления и искать его. Но я лично предпочитаю немного другую практику.

Вам не нужно проходить notice_id от формы вообще, если комментарий размещен на странице show, что уведомление по: :id уже часть маршрута там. Если вы вносите вложенный ресурс:

resources :notices do 
    resources :comments 
end 

... маршруты ваших комментариев придерживаются пути справа от уведомлений. Вы можете сделать контроллер для комментариев, а также коллекция комментариев может быть доступен с маршрутами, как:

notices_comments_path(@notice) 
# => /notices/42/comments 

Итак, когда вы оставить комментарий к URL вышеуказанного формата, то есть не пройти в не скрыто Титулы на всех:

  • Commentee можно оторвалась от данного params[:note_id] в маршруте
  • callsign можно посмотреть на current_user на яйцекладки контроллера эр (или с Devise или колдовством)

И причиной, чтобы сделать все это потому, что скрытые входы скрыты от глаз, но не от инструментов разработчика и как таковые открыты для фальсификации. Чтобы противостоять этому, возникает соблазн использовать дополнительные проверки в контроллере, но зачем это делать, если контроллер может назначить их сам по себе?

Предупреждение о борьбе с инфекцией: не слишком много гнездятся в ресурсах. 2 уровня в порядке, 3 уровня касаются, 4 уровня ужасны.