2013-02-07 7 views
5

ネストされたリソースを正しく作成して表示するために、ここ数日で問題が発生しました。 StackOverflowにはこれに似た質問がたくさんありますが、これについては多くのブログ記事がありますが、古いバージョンのRailsや別の問題を扱っているようです。私は最終的に何かを修正すると、別のエラーがポップアップするところです。私はそれを私に絞り込んで、愚かな間違いやタイプミスをして気付かれないようにしています。ネストされたリソースと一致するコントローラをルーティングする

Venueモデルに属するJobsモデルがあります。会場はうまく動作し、各会場の下にある自分のネストされたジョブズインデックスに移動して、新しいフォームと編集フォームを表示することができるようになりましたが、「表示」または新しいジョブを作成すると、undefined methodエラー。多くの検索の後、同じ問題がたくさんあり、修正プログラムを実装しようとしましたが、今はルーティングエラーが発生しています。

私の混乱の大部分は、いつ@を使用するのかということから来ます:venues_idの代わりに:id in paramsなどです。私が見ているすべての例は、別のやり方をしているようです。彼らの私のために働く。

正しい方向のバンプは非常に役立ちます。

ルーティングエラー

No route matches {:action=>"show", :controller=>"jobs", :venue_id=>#<Venue id: 1, name: "Burger Chef", city: "Chicago", state: "Illinois", areacode: 60614, created_at: "2013-02-05 21:33:41", updated_at: "2013-02-06 23:01:05", avatar_file_name: nil, avatar_content_type: nil, avatar_file_size: nil, avatar_updated_at: nil>} 

routes.rbを

Twist::Application.routes.draw do 


    resources :users 
    devise_for :users 

    resources :venues do 
    resources :jobs 
    end 

end 

jobs_controller.rb

class JobsController < ApplicationController 
    # GET /jobs 
    # GET /jobs.json 
    before_filter :get_venue 

    def get_venue 
    @venue = Venue.find(params[:venue_id]) 
    end 

    def index 
    @jobs = @venue.jobs 

    respond_to do |format| 
     format.html # index.html.erb 
     format.json { render json: @jobs } 
    end 
    end 

    # GET /jobs/1 
    # GET /jobs/1.json 
    def show 
    @job = @venue.job.find(params[:id]) 

    if params[:id] 
     @venue = Venue.where(:id => params[:id]).first 
     @jobs = @venue.job_url 
    else 
     @jobs = Jobs.all 
    end 

    respond_to do |format| 
     format.html # show.html.erb 
     format.json { render json: @job } 
    end 
    end 

    # GET /jobs/new 
    # GET /jobs/new.json 
    def new 
    @job = @venue.jobs.build 

    respond_to do |format| 
     format.html # new.html.erb 
     format.json { render json: @job } 
    end 
    end 

    # GET /jobs/1/edit 
    def edit 
    @job = @venue.job.find(params[:venue_id]) 


    end 

    # POST /jobs 
    # POST /jobs.json 
    def create 
    @job = @venue.jobs.new(params[:job]) 

    respond_to do |format| 
     if @job.save 


     format.html { redirect_to :action => :show, :id => @venue.id, 
         notice: 'Job was successfully created.' } 
     format.json { render json: [@venue, @job], 
          status: :created, 
          location: [@venue, @job] } 
     else 
     format.html { render action: "new" } 
     format.json { render json: @job.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # PUT /jobs/1 
    # PUT /jobs/1.json 
    def update 
    @job = Job.find(params[:id]) 

    respond_to do |format| 
     if @job.update_attributes(params[:job]) 
     format.html { redirect_to @job, notice: 'Job was successfully updated.' } 
     format.json { head :no_content } 
     else 
     format.html { render action: "edit" } 
     format.json { render json: @job.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # DELETE /jobs/1 
    # DELETE /jobs/1.json 
    def destroy 
    @job = Job.find(params[:id]) 
    @job.destroy 

    respond_to do |format| 
     format.html { redirect_to jobs_url } 
     format.json { head :no_content } 
    end 
    end 
end 

venue.rb

class Job < ActiveRecord::Base 
    attr_accessible :description, :name, :requirement, :venue_id 

    validates :name, :presence => true, :length => { :minimum => 3 } 

    belongs_to :venue 
end 

job.rb

class VenuesController < ApplicationController 
    # GET /venues 
    # GET /venues.json 


    def index 
    @venues = Venue.all 

    if params[:name] 
     @user = User.where(:name => params[:name]).first 
     @venues = @user.venues 
    end 

    respond_to do |format| 
     format.html # index.html.erb 
     format.json { render json: @venues } 
    end 
    end 

    # GET /venues/1 
    # GET /venues/1.json 
    def show 
    @venue = Venue.find(params[:id]) 


    respond_to do |format| 
     format.html # show.html.erb 
     format.json { render json: @venue } 
    end 
    end 

    # GET /venues/new 
    # GET /venues/new.json 
    def new 
    @venue = Venue.new 

    respond_to do |format| 
     format.html # new.html.erb 
     format.json { render json: @venue } 
    end 
    end 

    # GET /venues/1/edit 
    def edit 
    @venue = Venue.find(params[:id]) 

    #if session[:user_id] != @venue.user_id 
    # flash[:notice] = "Sorry, you cannot edit this venue." 
    # redirect_to(venues_path) 
    # =>end 
    end 

    # POST /venues 
    # POST /venues.json 
    def create 
    @venue = Venue.new(params[:venue_id]) 


    respond_to do |format| 
     if @venue.save 
     format.html { redirect_to @venue, notice: 'Venue was successfully created.' } 
     format.json { render json: @venue, status: :created, location: @venue } 
     else 
     format.html { render action: "new" } 
     format.json { render json: @venue.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # PUT /venues/1 
    # PUT /venues/1.json 
    def update 
    @venue = Venue.find(params[:id]) 

    respond_to do |format| 
     if @venue.update_attributes(params[:venue]) 
     format.html { redirect_to @venue, notice: 'Venue was successfully updated.' } 
     format.json { head :no_content } 
     else 
     format.html { render action: "edit" } 
     format.json { render json: @venue.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # DELETE /venues/1 
    # DELETE /venues/1.json 
    def destroy 
    @venue = Venue.find(params[:id]) 
    @venue.destroy 

    respond_to do |format| 
     format.html { redirect_to venues_url } 
     format.json { head :no_content } 
    end 
    end 
end 

venues_controller.rb

class Venue < ActiveRecord::Base 
    attr_accessible :areacode, :avatar, :city, :name, :state 


    has_many :jobs 

    has_attached_file :avatar, :styles => { :medium => "300x300>", :thumb => "100x100>" } 

end 

/jobs/show.html.erb

<p id="notice"><%= notice %></p> 


    <% @job = Job.find(param[:venue_id]) %> 

    <p> 
     <b>Name:</b> 
     <%= @job.name %> 
    </p> 

    <p> 
     <b>Company:</b> 
     <p><%= @venue.name %></p> 
     <p><%= link_to @job.venue.name, venue_path(@venue) %></p> 


    <p> 
     <b>Job:</b> 
     <%= @job.job_id %> 
    </p> 

    <p> 
     <b>Description:</b> 
     <%= @job.description %> 
    </p> 

    <p> 
     <b>Requirement:</b> 
     <%= @job.requirement %> 
    </p> 




    <%= link_to 'Edit', edit_venue_job_path(@venue, @job) %> | 
    <%= link_to 'Back', venue_jobs_path(@venue, @job) %> 

**/jobs/index.html.erb** 

<div class="usergrid"> 

    <% jobs = @venue.jobs %> 


    <% @venue.jobs.each do |job| %> 
<div class = "user venue"> 

    <p> 
     <h2><%= link_to job.name, venue_job_path(@venue) %></h2> 
     <%= link_to 'Edit', edit_venue_job_path(@venue, job) %><br/> 
     <%= link_to 'Delete', venue_jobs_path(@venue, @job), :confirm => 'Are you sure?', :method => :delete %> 
</div> 
<% end %> 
<div style="clear:both"></div> 
</div> 




<%= link_to 'New Job', new_venue_job_path(@venue) %> 

私がいることを実感...

  1. は、これは本当に明白な修正であるかもしれないが、私は完全に理解していないいくつかのファンダメンタルズは間違いなく、まだレールに新しいがありますされています。
  2. 私があまりにも多くのコードを投稿した場合は、私に知らせてください。
  3. 複数のエラーが存在する可能性があります。エラーが多発している可能性があります。そのうちの多くは、私が実際に何をしているのかわからないときにこれを修正しようとしています。私はこれを自分で解決したいと思っていましたが、実際にそれを悪化させている時には、もうそれをやり遂げることはできません。

実際のリンクとルートを変更したり、スコープを混乱させたり、これらのエラーの一般的な修正の多くを見つけてもらえませんでした。

ありがとうございます!

+0

さらに多くのスタックトレースを含めることができますか?あなたのmodel_idの代わりにあなたのモデルをあなたのルートに渡しているようです。 – drewinglis

+0

@drewinglis idが必要なときにurl_helperがインスタンスを受け取ったように、デフォルトでARオブジェクトの '#to_param'を呼び出そうとするような問題はありません。 – pjam

答えて

7

エラーが与えられたのparamsのためのルートが存在しないことを言っている:

{:action=>"show", :controller=>"jobs", :venue_id=> "an_id"} 

あなたはすくいルートを実行しているを確認することができ、あなたが仕事として会場の下にネストされていることがわかります、jobs#showコントローラの動作には、venue_id(ジョブの「親」)とジョブIDであるidの2つのパラメータが必要です。

私はすぐにあなたのコードをチェックし、私は1つのエラーが発生するものの一つが、このラインであることを考える:

<h2><%= link_to job.name, venue_job_path(@venue) %></h2> 

これは

<h2><%= link_to job.name, venue_job_path(@venue, @job) %></h2> 

基本的にあなたがそれを買ってあげるべきですあなたが会場を提供せずに仕事へのリンクをレンダリングしようとするときはいつも、エラーのようなものです。

詳細や詳細が必要な場合はお知らせください。

+0

私の問題はもう少しです私のコードはとてもうんざりしていたので、それよりも複雑ですが、間違いなく正しい方向に私を導いてくれました。ありがとう! – Jason

+0

それは完璧な答えではなかったが、それはあなたを助けてくれてうれしいよ:) – pjam

+0

"venue_job_path(@venue、@job)"に関するあなたのヒントは私のコードのその部分をリファクタリングするのを助けた。ありがとう! –

関連する問題