Rails / ActiveRecord has_many вопрос - PullRequest
       20

Rails / ActiveRecord has_many вопрос

0 голосов
/ 25 сентября 2011

Я использую Ruby 1.8.7 и Rails 2.3.5

Поэтому я пытаюсь выяснить, почему моя ассоциация has_many не работает должным образом.У меня есть 2 таблицы в базе данных, видео и комментарии.Внутри таблицы комментариев у меня есть внешний ключ столбца video_id, и при публикации комментария на странице моего видео ничего не отображается, поскольку столбец video_id имеет значение NULL, поэтому ничего не публикуется. Если я добавлю идентификатор видео в столбец video_id, выможете посмотреть комментарий.Я что-то упустил?

Video.rb

class Video < ActiveRecord::Base
 has_many :comments
end

Comment.rb

class Comment < ActiveRecord::Base  
 belongs_to :video
end

comments_controller.rb

  def create
    @comment = Comment.new(params[:comment])
    @comment.video_id = params[:video_id]    

    if @comment.save
      flash[:notice] = 'Your comment was saved!'
    else
      flash[:notice] = 'Sorry, there was a problem.'
    end

    redirect_to videos_path
  end

_form.html.erb

    <% form_for :comment, :url => comments_path(@video) do |f| %>

    <p>
      <%= f.label :name, "Your Name" %>
      <%= f.text_field :name %>  
    </p>
    <p>
      <%= f.label :body, "Your Comment" %>
      <%= f.text_field :body %>
    </p>
    <p>
      <%= f.submit "Submit", :disable_with => 'Submiting...' %>
    </p>


    <% end -%>

Routes.rb

    ActionController::Routing::Routes.draw do |map|

      map.index     '/',                          :controller => 'homepage', :action => 'index'
      map.logout    '/logout',                    :controller => 'sessions', :action => 'destroy'
      map.signout   '/signout',                   :controller => 'sessions', :action => 'destroy'
      map.login     '/login',                     :controller => 'sessions', :action => 'new'
      map.signin    '/signin',                    :controller => 'sessions', :action => 'new'
      map.register  '/register',                  :controller => 'users',    :action => 'create'
      map.signup    '/signup',                    :controller => 'users',    :action => 'new'
      map.activate  '/activate/:activation_code', :controller => 'users',    :action => 'activate', :activation_code => nil
      map.resources :users 
      map.resource  :session
      map.resources :comments
      map.resources :videos

      map.connect ':controller/:action/:id'
      map.connect ':controller/:action/:id.:format'

    end

Ответы [ 2 ]

1 голос
/ 25 сентября 2011

Вы не указали params[:video_id] правильно.

Из того, что я могу сказать, вы хотите разрешить пользователям комментировать видео?

Если это так, я считаю, что реальная структура маршрутизации вам нужна:

resources :videos do
  resources :comments
end

Это создаст путь, подобный video_comments_path(@video), к которому вы можете выполнить POST, и в действии создания выполните что-то вроде:

  @video = Video.find(params[:video_id])
  @comment = @video.comments.create(params[:comment])

Вот в основном это

1 голос
/ 25 сентября 2011

Вы можете использовать вложенный ресурс (я думаю, что они есть в 2.3.5, не уверен).

В противном случае вы можете изменить частичное для передачи параметра video_id:

_form.html.erb

<% form_for :comment, :url => comments_path(@video) do |f| %>

<%= hidden_field_tag 'video_id', @video.id %>
<p>
  <%= f.label :name, "Your Name" %>
  <%= f.text_field :name %>  
</p>
<p>
  <%= f.label :body, "Your Comment" %>
  <%= f.text_field :body %>
</p>
<p>
  <%= f.submit "Submit", :disable_with => 'Submiting...' %>
</p>

<% end -%>
...