Witajcie,
Pisze aplikacje, ktora ma dac mozliwosc komentowania roznych modeli,
postanowilem wiec zgodnie z metodyka DRY, pojsc w slady polymorphic controllers
Wszystko ladnie smiga do momentu, gdzie chce dodac funkcjonalnosc wystawiania komentarza jednemu uzytkownikowi przez drugiego
Na przyklad w momencie wyswietlania spotkania, w metodzie show, tworze nowa instancje potencjalnego komentarza, ktory byc moze jakis user chce wystawic na temat ogladanego spotkania:
def show
@meeting = Meeting.find(params[:id])
@comment = Comment.new
@comment.user = current_user
@comment.meeting = @meeting
render :layout => "meeting"
end
Gdzie nastepnie w widoku mam
<% form_for ([@meeting, @comment]) do |f| %>
<%= f.text_area :content, :cols => 55, :rows => 5 %>
<%= f.submit 'Zapisz komentarz' %>t>
<% end %>
Skoro wlascicielem komentarza jest model User, jak mam stworzyc formularz dajacy mozliwosc komentowania jednego Usera przez drugiego ?
<% form_for ([@user, @comment]) do |f| %>
<%= f.text_area :content, :cols => 55, :rows => 5 %>
<%= f.submit 'Zapisz komentarz' %>t>
<% end %>
Po wyslaniu zwraca mi :
[quote]NoMethodError in CommentsController#create
undefined method `comments’ for nil:NilClass
/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.5/lib/active_support/whiny_nil.rb:52:in method_missing' /home/wojtek/git/ze/app/controllers/comments_controller.rb:26:in
create’[/quote]
wklejka CommentsController@create na koniec:
[code] def create
@parent = parent_object
params[:comment][:user_id] = current_user.id
@comment = @parent.comments.build(params[:comment])
if @comment.save
redirect_to send("#{parent_type}_url", @parent)
else
render :action => "new"
end
end[/code]
Dla niewtajemniczonych: kod ApplicationController (fragment)
[code] protected
class << self
attr_reader :parents
def parent_resources(*parents)
@parents = parents
end
end
def parent_id(parent)
request.path_parameters["#{parent}_id"]
end
def parent_type
self.class.parents.detect {|parent| parent_id(parent) }
end
def parent_class
parent_type && parent_type.to_s.classify.constantize
end
def parent_object
parent_class && parent_class.find_by_id(parent_id(parent_type))
end[/code]
Pozdrowienia