«Не могу найти <object>без идентификатора» - PullRequest
4 голосов
/ 02 июня 2011

У меня проблемы с реализацией своего рода формы комментариев, в которой комментарии (называемые «микросообщениями») принадлежат как пользователям, так и сообщениям, пользователи имеют_многокие комментарии и сообщения (называемые «предложениями»), имеют комментарии__много.

Мой код для формы комментариев:

<%= form_for @micropost do |f| %>
  <div class="field">
      <%= f.text_area :content %>
  </div>

  <div class="actions">
    <%= f.submit "Submit" %>
  </div>
<% end %>

MicropostsController имеет это в действии создания:

  def create

      @proposition = Proposition.find(params[:proposition_id])

  @micropost = current_user.microposts.build(params[:micropost])
  @micropost.proposition = @proposition
  if @micropost.save
      flash[:success] = "Contribution submitted"
      redirect_to root_path
  else
          @feed_items = []    
      render 'pages/home'
  end
  end

Форма для создания нового микросообщения находится на той же странице, что и предложениеТем не менее, идентификатор предложения, кажется, не передается в любой момент.

Это ошибка, которую я получаю при отправке формы микросообщений:

ActiveRecord :: RecordNotFound в MicropostsController #create

Не удалось найти предложение без идентификатора

Параметры:

{"commit" => "Submit", "micropost" => {"offerition_id" => "", "content" => "Первый комментарий"}, "authenticity_token" => "TD6kZaHv3CPWM7xLzibEbaLJHI0Uw43H + pq88HLZFjc =", "utf8" => "✫ "} *

* 10 *

Я совершенно новичок в рельсах и очень плохо знаком с кодировкой.Я вообще благодарен за любую помощь, которую вы можете мне оказать!

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 02 июня 2011

Ваши параметры:

"micropost"=>{"proposition_id"=>"", "content"=>"First comment"}

Итак, чтобы получить proposition_id, вам нужно сделать:

params[:micropost][:proposition_id]

Но это пусто.И некуда больше получить это id, поэтому эта строка возвращает nil:

@proposition = Proposition.find(params[:proposition_id])

В случае сбоя:

@micropost.proposition = @proposition

Вы должны либо:

  • добавить proposition_id как hidden_field

  • сохранить его в сеансе

Но я ненедостаточно знаете ваш контекст, чтобы найти здесь правильное решение.

РЕДАКТИРОВАТЬ:

В вашей ссылке заменить:

<%= f.hidden_field :proposition_id %>

на:

<%= f.hidden_field :proposition_id, :value => @proposition.id %>

Если это не работает, покажите свои параметры.

Примечание: плохая практика полагаться на переменные экземпляра, вы должны отправлять локальную переменную каждому частичному

1 голос
/ 02 июня 2011

Как видите, параметр proposition_id пуст, поэтому ваш контроллер не может найти предложение, если вы не укажете ему действительный идентификатор.

Вы должны убедиться, что ваша форма new отправляетатрибут proposition_id.Один из способов сделать это:

  1. Установите предложение в действии new в контроллере: @micropost.proposition = ...

  2. В форме, добавьте скрытое поле для идентификатора: f.hidden_field :proposition_id

  3. В действии create найдите соответствующее Предложение с помощью params[:micropost][:proposition_id]

(Вы также захотите использовать attr_accessible в своей модели Micropost и убедиться, что proposition_id НЕ в этом списке. В противном случае вы будете открыты для неприятных пробелов в безопасности. См. http://www.kalzumeus.com/2010/09/22/security-lessons-learned-from-the-diaspora-launch/ и Какие поля должны быть защищены от массового назначения? )

РЕДАКТИРОВАТЬ (из-за комментария):

Ваше новое действие должно быть таким:

def new
  @micropost = Micropost.new
  @micropost.proposition_id = params[:proposition_id]

Это немного отличается от того, что сказано выше, и связано с тем, что вы отправляете id предложения в запросе на new.Нет необходимости искать фактическую запись предложения, поскольку нас интересует только поле id (которое у нас уже есть).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...