2017-06-06 55 views
1

我有一個名爲Produto的控制器和一個名爲Produto的模型。我想將所有Produto對象傳遞給Produto控制器執行的變量,但傳遞給另一個控制器。因此,控制器Produto在她的Index def中獲取@Produto = Produto.all,並且該控制器的視圖使用該變量。但我想在其他控制器中執行此操作。 看看我有:爲什麼我的變量是零? - 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'那麼您必須使用inicio.html.erb視圖,而不是index.html.erb

+2

這可能是'home_controller。rb' –

+0

沒有必要,但這沒有工作= \ –

+0

def index @produtos = Produto.all end 已在主控制器上分配的變量。 –