Noob question that took me a whole day

Alright I spent 3 hours on the easiest question in ruby on rails and still can't figure out the answer. Please help... Basically I am trying to create a new object. So of course I have two methods class Ratings def new

end

def create

end

Inside new I was already able to find the object that I want, a wine object. Now how am I suppose to pass that wine object from the new method to the create method? Thanks

What does Ratings extend from? Where is this file? What code is in the new and create actions? What are you trying to do?

Ryan Bigg wrote:

What does Ratings extend from? Where is this file? What code is in the new and create actions? What are you trying to do?

ratings extend from application, this file is in the controller folder?

  def new     @rating = Rating.new     @wine = Wine.find(params[:id])     @rating.wine = @wine

    respond_to do |format|       format.html # new.html.erb       format.xml { render :xml => @rating }     end   end

  def create     @rating = Rating.new(params[:rating])     @rating.wine = @wine     respond_to do |format|       if @rating.save         flash[:notice] = 'Rating was successfully created.'         format.html { redirect_to(@rating) }         format.xml { render :xml => @rating, :status => :created, :location => @rating }       else         format.html { render :action => "new" }         format.xml { render :xml => @rating.errors, :status => :unprocessable_entity }       end     end   end

I am trying to pass the @wine from new method to the create method

Can you show me the full ratings controller please? I'm especially interested in the first few lines.

Ryan Bigg wrote:

Can you show me the full ratings controller please? I'm especially interested in the first few lines.

class RatingsController < ApplicationController   layout 'standard'   # GET /ratings   # GET /ratings.xml     before_filter :login_required, :only => [ :destroy]   def index     @ratings = Rating.find(:all)

    respond_to do |format|       format.html # index.html.erb       format.xml { render :xml => @ratings }     end   end

  # GET /ratings/1   # GET /ratings/1.xml   def show     @rating = Rating.find(params[:id])

    respond_to do |format|       format.html # show.html.erb       format.xml { render :xml => @rating }     end   end

  # GET /ratings/new   # GET /ratings/new.xml   def new     @rating = Rating.new     @wine = Wine.find(params[:id])     @rating.wine = @wine

    respond_to do |format|       format.html # new.html.erb       format.xml { render :xml => @rating }     end   end

  # GET /ratings/1/edit   def edit     @rating = Rating.find(params[:id])   end

  # POST /ratings   # POST /ratings.xml   def create     @rating = Rating.new(params[:rating])     @wine = Wine.find(params[:wine])     @rating.wine = @wine     respond_to do |format|       if @rating.save         flash[:notice] = 'Rating was successfully created.'         format.html { redirect_to(@rating) }         format.xml { render :xml => @rating, :status => :created, :location => @rating }       else         format.html { render :action => "new" }         format.xml { render :xml => @rating.errors, :status => :unprocessable_entity }       end     end   end

  # PUT /ratings/1   # PUT /ratings/1.xml   def update     @rating = Rating.find(params[:id])     @wine = Wine.find(params[:wine])     @rating.wine = @wine     respond_to do |format|       if @rating.update_attributes(params[:rating])         flash[:notice] = 'Rating was successfully updated.'         format.html { redirect_to(@rating) }         format.xml { head :ok }       else         format.html { render :action => "edit" }         format.xml { render :xml => @rating.errors, :status => :unprocessable_entity }       end     end   end

  # DELETE /ratings/1   # DELETE /ratings/1.xml   def destroy     @rating = Rating.find(params[:id])     @rating.destroy

    respond_to do |format|       format.html { redirect_to(ratings_url) }       format.xml { head :ok }     end   end end

Thanks!

Ryan Bigg wrote:

You must use nested routes. Try modifying your config/routes.rb like this:

map.resources :wines do |wine| wine.resources :ratings end

I think he is using nested routes. His form is wrong.

Instead of: form_for @rating

It should be: form_for [@wine, @rating]

It appears the guide doesn't go into this detail clearly enough, I will update it.