Перенос переменных между моделями с использованием представления - PullRequest
2 голосов
/ 10 мая 2009

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

Итак, моя модель книги содержит "has_many: comments" и у меня модель комментария имеет: "own_to: book"

представление, которое я использую для просмотра и добавления комментариев: "/views/book/viewbook.html.erb" Это показывает книгу и все ее детали, в нижней части находится раздел, где пользователь может добавить свои собственные комментарии, это выглядит так: <%= form.text_field :title %> <%= form.text_area :body %> <%= submit_tag "Add Comment", :class => "submit" %>

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

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

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

Ответы [ 5 ]

2 голосов
/ 10 мая 2009

Вы определяете, для чего нужна форма, в открывающем теге формы:

<% 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 голосов
/ 11 мая 2009

Чтобы найти комментарии к книге, просто:

@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 %>

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

0 голосов
/ 11 мая 2009

Таким образом, теперь можно успешно оставлять комментарии и сохранять их с правильными деталями, теперь я могу отобразить список комментариев этой конкретной книги, используя значение 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. Не работает, но выдает сообщение об ошибке:

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

И строка 27 -

 <% for review in @reviews %>
0 голосов
/ 10 мая 2009

Итак, я изменил его, используя ваши замечательные предложения, и теперь появилась только одна проблема. Хотя теперь я могу успешно сохранить заголовок комментария, текст, время и человека, который оставил комментарий в БД, я все еще не могу понять, как использовать 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 голосов
/ 10 мая 2009

Похоже, вам нужно использовать вложенные формы объекта. Это новая функция в Rails 2.3:

http://ryandaigle.com/articles/2009/2/1/what-s-new-in-edge-rails-nested-attributes

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