在嵌套资源中创建新项目的问题

时间:2011-07-22 01:31:58

标签: ruby-on-rails ruby ruby-on-rails-3

我有如下嵌套资源:

employer.rb

class Employer < ActiveRecord::Base

    has_many :listings

end

listing.rb

class Listing < ActiveRecord::Base

    belongs_to :employer

end

我使用基本支架生成器构建了两个。

除非我为雇主创建新的商家信息,否则一切似乎都有效。路线是

new_employer_listing GET
/company/:employer_id/listings/new(.:format)
{:action=>"new", :controller=>"listings"}

当我导航到新的列表网址(company / employer_id / listings / new)

我明白了:

NoMethodError in ListingsController#new
undefined method `listing' for #<Employer:0x102dd5e48>

以下是#new

的listing_controller代码
  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

同样,其他一切工作(显示,编辑等) - 我只是无法得到一个新的列表页面......任何帮助都会很棒。

谢谢!

//编辑以下

  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>}

2 个答案:

答案 0 :(得分:2)

在雇主模型中,您添加了has_many :listings关联。但是在您的控制器中,您可以拨打@employer.Listing.new。这里不匹配的是列表和列表。

你应该这样做:

@listing = @employer.listings.new(params[:listing)

图片的标题说明:

不要忘记在@listing上拨打save,否则将无法保存。

我更喜欢使用build而不是new,这样就可以直接在雇主协会中找到该列表。两种方法都有效,具体取决于您使用它们的方式。

答案 1 :(得分:1)

雇主has_many个商家信息,因此您必须使用s调用@employer.listings