I have nested resources as follows:
employer.rb
class Employer < ActiveRecord::Base
    has_many :listings
end
listing.rb
class Listing < ActiveRecord::Base
    belongs_to :employer
end
I built both using basic scaffold generator.
Everything seems to work except when I create a new listing for employer. The route is
new_employer_listing GET
/company/:employer_id/listings/new(.:format)
{:action=>"new", :controller=>"listings"}
When I navigate to the new listing url (company/employer_id/listings/new)
开发者_Go百科I get:
NoMethodError in ListingsController#new
undefined method `listing' for #<Employer:0x102dd5e48>
Here is the listings_controller code for #new
  def new
    @employer = Employer.find_by_username(params[:employer_id])
    @listing = @employer.listing.new
    respond_to do |format|
      format.html # new.html.erb
      format.xml  { render :xml => @listing }
    end
  end
Again, everything else works (show, edit, etc) -- I just can't get a new listing page to come up... Any help would be awesome.
Thanks!
//EDIT BELOW
  def create
    @employer = Employer.find_by_username(params[:employer_id])
    @listing = @employer.listings.new(params[:listing])
    respond_to do |format|
      if @listing.save
        format.html { redirect_to(@listing, :notice => 'Listing was successfully created.') }
        format.xml  { render :xml => @listing, :status => :created, :location => @listing }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @listing.errors, :status => :unprocessable_entity }
      end
    end
  end
ERROR:
No route matches {:action=>"show", :controller=>"listings", :id=>#<Listing id: 20, job_title: "asd", location: nil, status: nil, industry: nil, years: nil, degree_type: nil, degree_field: nil, employer_id: 1, employers_id: nil, user_id: nil>}
In the Employer model you have added the has_many :listings association. But in your controller you call @employer.Listing.new. The thing that does not match here is Listing and listings.
You should instead do it like this:
@listing = @employer.listings.new(params[:listing)
Sidenotes:
Don't forget to call save on the @listing, otherwise it will not get saved.
I prefer to use build instead of new, that way the listing is available in the Employer association directly. Both methods valid though depending on how you use them.
The employer has_many listings, so you have to call @employer.listings, with an s.
 
         
                                         
                                         
                                         
                                        ![Interactive visualization of a graph in python [closed]](https://www.devze.com/res/2023/04-10/09/92d32fe8c0d22fb96bd6f6e8b7d1f457.gif) 
                                         
                                         
                                         
                                         加载中,请稍侯......
 加载中,请稍侯......
      
精彩评论