7

ここ数日、ネストされたリソースを適切に作成して表示するのに問題がありました。StackOverflow に関する同様の質問がたくさんあり、これに関する多くのブログ投稿がありますが、それらはすべて、Rails の古いバージョンまたは別の問題を扱っているようです。最終的に何かを修正すると、別のエラーが表示されるところまで来ています。私は愚かな間違いを犯したり、経験が浅すぎて気付かないタイプミスをしたりすることに絞り込みました。

Venue モデルに属する Jobs モデルがあります。会場は正常に機能し、各会場の下にネストされたジョブ インデックスに移動して、新規および編集フォームを表示できるようになりましたが、[表示] に移動するか、新しいジョブを作成するとundefined methodエラーが発生しました。何度も検索した後、同じ問題を抱えているものがたくさん見つかり、それらの修正を実装しようとしましたが、今ではルーティング エラーが発生しています。

私の混乱のほとんどは、@ をいつオフにするか、params で :id の代わりに :venue_id をいつ使用するかなどから来ています。自分。

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

ルーティング エラー

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

ルート.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

会場_コントローラー.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

ジョブ.rb

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

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

  belongs_to :venue
end

会場.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. これは非常に明白な修正かもしれませんが、Rails を初めて使用するので、まだ完全に理解していない基本的なことがいくつかあります。
  2. 投稿したコードが多すぎたり少なすぎたりした場合はお知らせください。
  3. 複数のエラーが発生している可能性があり、多くのエラーが発生している可能性があり、その多くは、自分が何をしているのか本当にわからないときにこれを修正しようとしたことが原因である可能性があります. 私はこれを自分で修正したかったのですが、本当に悪化させているだけなので、もういじることはできません.

ルートをいじったり、実際のリンクとルートを変更したり、スコープをいじったり、これらのエラーの一般的な修正をできるだけ多く試してみましたが、どれも役に立たなかったようです。

ありがとう!

4

1 に答える 1

8

エラーは、指定されたパラメータのルートがないことを示しています:

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

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

私はすぐにあなたのコードをチェックしました、そして私はエラーを引き起こすものの1つがこの行であると思います:

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

これは

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

基本的に、会場を提供せずにジョブへのリンクをレンダリングしようとすると、そのようなエラーが発生します。

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

于 2013-02-08T01:34:17.597 に答える