2017-06-06 17 views
1

私はProdutoと呼ばれるコントローラとProdutoというモデルを持っています。 Produtoのすべてのオブジェクトを、Produtoのコントローラと同じように変数に渡したいが、別のコントローラに渡したい。そのため、コントローラProdutoはIndex Defで@ Produto = Produto.allを使用し、このコントローラのビューはその変数を使用します。しかし、私は他のコントローラでこれをやりたい 私が持っているものを見て:なぜ私の変数がNilですか? - Ruby on Rails

Produtoコントローラ:

class ProdutosController < ApplicationController 
    before_action :set_produto, only: [:show, :edit, :update, :destroy] 

    # GET /produtos 
    # GET /produtos.json 
    def index 
    @produtos = Produto.all 
    end 

    def show 
    end 

    def new 
    @produto = Produto.new 
    end 

    def edit 
    end 

    def create 
    @produto = Produto.new(produto_params) 
    respond_to do |format| 
     if @produto.save 
     format.html { redirect_to @produto, notice: 'Produto was successfully created.' } 
     format.json { render :show, status: :created, location: @produto } 
     else 
     format.html { render :new } 
     format.json { render json: @produto.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    def update 
    respond_to do |format| 
     if @produto.update(produto_params) 
     format.html { redirect_to @produto, notice: 'Produto was successfully updated.' } 
     format.json { render :show, status: :ok, location: @produto } 
     else 
     format.html { render :edit } 
     format.json { render json: @produto.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    def destroy 
    @produto.destroy 
    respond_to do |format| 
     format.html { redirect_to produtos_url, notice: 'Produto was successfully destroyed.' } 
     format.json { head :no_content } 
    end 
    end 

    private 
    # Use callbacks to share common setup or constraints between actions. 
    def set_produto 
     @produto = Produto.find(params[:id]) 
    end 

    # Never trust parameters from the scary internet, only allow the white list through. 
    def produto_params 
     params.require(:produto).permit(:nome, :preco, :fornecedor_id) 
    end 
end 

ホームコントローラ(これは私がそれらのProdutoがProdutoコントローラと同じように、あまりにもオブジェクトを取りたいコントローラです):

class HomeController < ApplicationController 

    def index 
    @produtos = Produto.all 
    render "index" 
    end 

    def show 
    if session[:user] 
     @user = User.find(session[:user]) 
    end 
    end 

end 

ホームの景色はこのコードの部分です:

<table> 
    <thead> 
    <tr> 
     <th>Nome</th> 
     <th>Preco</th> 
     <th>Fornecedor</th> 
     <th colspan="3"></th> 
    </tr> 
    </thead> 

    <tbody> 
    <% @produtos.each do |produto| %> 
     <tr> 
      <td><%= produto.nome %></td> 
      <td><%= produto.preco %></td> 
      <td><%= produto.fornecedor %></td> 
      <td><%= link_to 'Show', produto %></td> 
      <td><%= link_to 'Edit', edit_produto_path(produto) %></td> 
      <td><%= link_to 'Destroy', produto, method: :delete, data: { confirm: 'Are you sure?' } %></td> 
     </tr> 
    <% end %> 
    </tbody> 
    </table> 

と私は、このエラー取得しています:

未定義のメソッド `各」ゼロについて:NilClass <%の@ produtos.each行う | produtoを| (ルートルートである)

Rails.application.routes.draw do 

    root 'login#new' 
    get 'home#index' 

    scope '/login' do 
    get '/acesso', to:'login#new' 
    post '/acessorecebendo', to:'login#create' 
    get '/sair', to:'login#destroy' 
    end 

    resources :login 
    resources :home 
    resources :produtos 
    resources :fornecedors 
end 

ログインコントローラ::>

マイルート%

class LoginController < ApplicationController 
    skip_before_action :verify_authenticity_token 

    def new 
    if session[:user] 
     @user = User.find(session[:user]) 
    end 
    end 

    def destroy 
    reset_session 
    redirect_to "/login/acesso", notice: "Você foi deslogado" 
    end 


    def create 
    user = User.validate(login_params[:email], login_params[:senha]) 
    if user 
     session[:user] = user.id 
     redirect_to "/home/index", notice: "login feito com sucesso" 
    else 
     redirect_to "/login/acesso", notice: "Dados incorretos" 
    end 

    end 
    private 
    def login_params 
    params.require(:login).permit(:email, :senha) 
    end 
end 
+0

どのビューが '@produtos.each'ですか? –

+0

ホームコントローラのビューであるinicio.html.erbというビュー –

+0

変数 '@produtos'をそこに作成する必要があります。この方法は、そのメソッドに応答するビューで利用できます。 –

答えて

0

、ビューの試合をあなたのルート、メソッドを作成します。

# config/routes.rb 
get '/home/inicio', to: 'home#index' 

# app/controllers/home_controller.rb 
def index 
    @produtos = Produto.all 
end 

# app/views/home/index.html.erb 
<% @produtos.each do |produto| %> 

ご覧のとおり、URIだけが変更されますが、を参照する必要がありますコントローラメソッドとビュー名の両方のメソッド。

render 'inicio'を使用する場合は、index.html.erbの代わりにinicio.html.erbビューを使用する必要があります。

+2

おそらく 'home_controllerです。rb' –

+0

は必要ではありませんが、この作業は\ –

+0

です。def index @produtos = Produto.all end 変数はすでにホームコントローラに割り当てられています。 –

関連する問題