2009-05-10 3 views
2

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

Так что моя книга модель содержит «HAS_MANY: комментарии» и мне прокомментировать модель: «belongs_to: книга»

вид я использую как для просмотра и добавления комментариев на «/ Views/книга/ViewBook. html.erb « это показывает книгу и все ее детали, в нижней части есть раздел, в котором пользователь может добавлять свои собственные комментарии, это выглядит следующим образом:

 
    <%= form.text_field :title %> 
    <%= form.text_area :body %> 
    <%= submit_tag "Add Comment", :class => "submit" %> 

теперь я знаю, что это не может работать, потому что выше» : title "и": body "будет в модели книги, но мне нужно, чтобы они были отправлены в модель комментариев, потому что они находятся в базе данных комментариев. Как передать эти данные в базу данных комментариев. Я пробовал «: comment.title» и другие различные вещи, но по-прежнему не могу тренироваться, как передавать эти данные.

Любые мысли были бы весьма благодарны.

(прошу прощения, если этот вопрос очень глупый или не объяснил, мой преподаватель установить это назначение и рельсы не язык я когда-либо использовал.)

ответ

2

Вы определяете, что форма для в виде открытия тега:

<% form_for :comment do |form| %> 

    <%= form.text_field :title %> 
    <%= form.text_area :body %> 

    <%= submit_tag "Add Comment", :class => "submit" %> 

<%= end %> 

Идея заключается в том, что форма является комментарий пустой объект. Контроллеры взаимодействуют между моделями и представлениями, поэтому ваш контроллер должен иметь действие для обработки формы, которая знает, чтобы сохранить объект комментария в модель комментария. Вы также захотите указать, в какой книге есть комментарий. Есть много способов справиться с этим (скрытые поля, вложенные ресурсы RESTful и т. Д.).

Может быть, начать здесь: http://guides.rubyonrails.org/action_controller_overview.html

0

Так я модифицировал его, используя свои большие предложения и теперь только одна проблема прийти вверх. Пока я могу теперь сохранить заголовок комментариев, тело, время и человека, который оставил комментарий в БД, я все еще не могу понять, как использовать store.book.id. Вот вид:

<% form_for :comment, :url => { :action => "addcomment" } do |form| %> 
    <%= form.hidden_field :user_id, :value => session[:user_id] %> 
    <%= form.hidden_field :book_id, :value => @book.id %> <!-- WONT WORK --> 
    <%= form.label "Title" %><%= form.text_field :title %><br /> 
    <%= form.label "Comment" %><%= form.text_area :comment %> 
    <%= submit_tag "addComment", :class => "submit" %> 
<% end %> 

Вот мой контроллер, который теперь можно успешно хранить информацию, кроме book.id

def addcomment 
    @newcomment = Comment.new(params[:comment]) 
    if @newcomment.save 
    flash[:notice] = "Comment Was Added To The System." 
    redirect_to :action => "index" 
    end 
end 

я, хотя это «@ book.id» будет работать, потому что в что я также показываю детали книг, используя такие вещи, как «@ book.title» и «@ book.authour», и это, похоже, работает, но не для поля идентификатора.

+0

Похоже, это должно сработать. Правильно ли настроены ваши ассоциации в ваших моделях (has_many и принадлежит_to)? Возможно, он сохраняет правильную информацию, но без правильных ассоциаций он не находит, что нужно. – Jarrod

+0

Не принимайте отправление user_id через форму. Прочтите его из сеанса при сохранении комментария к БД. В противном случае любой может отправить комментарий как кому-либо еще. Другими словами, вам не следует доверять данные, отправленные с клиента. – James

0

Теперь можно успешно публиковать комментарии и хранить их с правильными деталями, теперь im on для отображения списка комментариев этой конкретной книги с использованием значения «book_id».Вот то, что я думал, что будет работать, я также код, как это в поисковой части моего приложения, так что я думал, что это было бы хорошо:

def view 
    @book = Book.find(params[:id]) 
    @reviews = Comment.find_by_book_id(@book.id) 
end 

С соответствующим видом:

<% if @reviews %> 
    <% for review in @reviews %> 
    <%= form.label "Title: " %><%h review.title %> <br /> 
    <%= form.label "Review:" %><%h review.comment %> 
    <% end %> 
<% end %> 

Теперь, когда должен получить комментарии, которые имеют «book_id» книги, которую я просматриваю, и отображение каждого из них с помощью цикла for. Doesnt достаточно работать, хотя, он выплевывает сообщение об ошибке сказав следующее:

#undefined method `each' for #<Comment:0xb682c2f4> 
#Extracted source (around line #27) 

И линия 27 является

<% for review in @reviews %> 
0

Чтобы найти комментарии для книги это просто:

@book = Book.find(params[:id]) 

как вы уже это сделали, то:

@book.comments 

для этого комментарии к книгам. Таким образом:

<% for review in @book.comments % 
    <%= form.label "Title: " %><%h review.title %> <br /> 
    <%= form.label "Review:" %><%h review.comment %> 
<% end %> 

Вам не нужно находить комментарии в контроллере.

Смежные вопросы