2016-11-05 9 views
0

私はrestaurantsのスキャフォールディング方法を使ってレールに簡単なレールアプリを作成しました。railsはコントローラからビューへのインスタンス変数をどのように渡しますか?

これはrestaurants_controller.rbのコントローラの表示と編集です。彼らはちょうど空白のメソッドであるかに注目してください:

# GET /restaurants/1 
    # GET /restaurants/1.json 
    def show 
    end 

    # GET /restaurants/1/edit 
    def edit 
    end 

これはrestaurants/show.html.erbです:

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

<%= image_tag @restaurant.image_url %> 

<p> 
    <strong>Name:</strong> 
    <%= @restaurant.name %> 
</p> 

<p> 
    <strong>Address:</strong> 
    <%= @restaurant.address %> 
</p> 
... 

restaurants/edit.html.erb:ここ

<h1>Editing Restaurant</h1> 

<%= render 'form', restaurant: @restaurant %> 

<%= link_to 'Show', @restaurant, class: "btn btn-link" %> | 
<%= link_to 'Back', restaurants_path, class: "btn btn-link" %> 

は私の質問です:私の現在の理解は(間違っている可能性)でありますインスタンス変数、この場合は@restaurantrestaurant_controllers.rbに定義し、Railsはcontrで定義された変数を自動的に接続しますビューへのoller。例えば、レストランのコントローラのインデックス方法:私はindex.html.erb@restaurantsを呼び出すとき

def index 
    @restaurants = Restaurant.all 
end 

、Railsはviewsで使用するインデックスメソッドから@restaurantsが表示されます。レールがrestaurants_controller.rbにもかかわらずshowedit方法からshow.html.erbedit.html.erb@restaurantインスタンス変数を取得ん

は空のメソッドですか?私はあなたがする必要がない場合はすべてのアクションに

@test = Test.find(params[:id])を追加するのと同じ用量が生成足場

class TestsController < ApplicationController 
before_action :set_test, only: [:show, :edit, :new, :update, :destroy] 

private 

    def set_test 
    @test = Test.find(params[:id]) 
    end 
end 

これを適用することによって、このacheivesレールレール5.

+0

あなたのコントローラに 'before_action:set_restaraunt'がありますか? –

+0

コントローラに 'load_and_authorize_resource'と一緒にCanCanを使用していますか? – David

答えて

0

を使用しています。..

その後、

イムなしレールプロbefore_actionによって定義されたアクションのインスタンス変数を設定し

、そうがあるかもしれませんこれにはるかに良い答えが、私は "レールの魔法"に疑問を呈さないことを学んだ。

+0

であり、独自のMVCを生成して上記の同じ習慣を適用すると同じことができます。 –

関連する問題