Идентификатор: есть, но я не могу получить к нему доступ, как это возможно? - PullRequest
0 голосов
/ 18 октября 2011

В адресной строке браузера у меня есть http://localhost:3000/comment/index?post_id=6, я могу получить доступ к post_id в индексе, но при попытке создать комментарий / публикацию в действии создания, он говорит, что не может найти запись без идентификатора записи в журнале.что здесь происходит? заранее спасибо.

Комментарии контролера:

def index
  @post=Post.find(params[:post_id])
end

def create
  @post     = Post.find(params[:post_id])
  @comment  = @post.comments.build(params[:comment])
  @comment.save

  respond_with( @comment, :layout => !request.xhr? )          
end

comments/index просмотр:

<%= form_for :comment, :remote => true,
                       :url => { :controller => "comments",
                                 :action     => "create"
                               },
                       :html => { :id => 'new-comment'} do |f|
%>
  <%= f.hidden_field :post_id, :value => @post.id %>
  <%= f.text_area :body %>
  <%= f.submit "post" %>
<% end %>

В логе:

Started POST "/comments" for 127.0.0.1 at 2011-10-17 14:06:36 -0700
  Processing by CommentsController#create as JS
  Parameters: {"utf8"=>"✓",  
    "authenticity_token"=>"cxQm2K2xwsyw0DY2XLNvkcMQI+wM96LpEENbfQqxu5c=",
    "comment"=> {"post_id"=>"6", "body"=>"This is the comment"},
    "commit"=>"post"}
  Completed 404 Not Found in 23ms

  ActiveRecord::RecordNotFound (Couldn't find Post without an ID):

Ответы [ 2 ]

4 голосов
/ 18 октября 2011

Если вы посмотрите на хэш параметров в вашем журнале, вы увидите это:

{ "utf8"=>"✓",
  "authenticity_token"=>"cxQm2K2xwsyw0DY2XLNvkcMQI+wM96LpEENbfQqxu5c=",
  "comment"=> {
      "post_id"=>"6", # <-- there's your post_id
      "body"=>"This is the comment" },
  "commit"=>"post" }

Итак, идентификатор записи есть, но он внутри хеша comment. Итак, в вашем действии создания вам просто нужно изменить на:

def create
  @post=Post.find(params[:comment][:post_id])
  @comment = @post.comments.build(params[:comment])
  @comment.save
  respond_with( @comment, :layout => !request.xhr? )          
end

Однако вы должны немного упростить действие создания.

def create
  @comment = Comment.new(params[:comment])
  @comment.save
  respond_with( @comment, :layout => !request.xhr? )
end

Поскольку post_id находится в параметрах comment, комментарий будет автоматически ассоциироваться с публикацией при ее создании без необходимости поиска записи. Если вам нужно получить доступ к сообщению в вашем представлении, вы можете использовать @comment.post.

1 голос
/ 18 октября 2011

Пожалуйста, не передавайте свое поле как hidden_field в форме. Лучший способ сделать это - пойти так:

<%= form_for :comment,
             :remote => true,
             :url    => post_comments_path(post)
             :html => { :id => 'new-comment'} do |f| %>

Используя помощников по маршрутизации, которые предоставляет вам Rails, это очистит вашу форму:

  1. Отсутствие использования уродливого синтаксиса хэша для генерации URL-адреса для вашей формы
  2. Вы не должны указывать hidden_field в форме для отправки через URL; и
  3. Автоматически отправлять через параметр post как params[:post_id], точно так же, как Бог Намерение DHH.

Это означает, что вы сможете найти его в своем действии с помощью следующей строки кода:

Post.find(params[:post_id])

Вместо этого, который излишне длиннее и, следовательно, более болезненный для ввода:

Post.find(params[:comment][:post_id])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...