Rails 4在视图或模板中传递变量

时间:2014-10-12 12:30:56

标签: ruby-on-rails variables ruby-on-rails-4 views

我有一个应用程序,允许所有者(但不是公共用户)上传相册文件和照片。在编写我的视图时,我注意到一些奇怪的事情。在我的albums / index.html.erb文件的do块中,如果我传入变量@ album.id,我得到NilClass.Yet的NoMethodError,如果我删除& #34; @",(或完全删除该变量),它工作正常。

但在我的专辑/ show.html.erb文件中,在用于编辑专辑标题的link_to代码行中,我需要" @ album.id"要传递(或完全省略变量)以使其工作。

为什么?

这是我的相册/ index.html.erb文件和代码

    <div class="admin_login"><%= link_to "Admin Login", new_album_path %></div>
    <div class="home"><%= link_to "Home", root_path %></div>

    <h1>Albums Gallery</h1>

    <% @albums.each do |album| %>
      <div>
        <%= link_to album.name, album_path(album.id) %>    
      </div>
    <% end %>

这是我的专辑/ show.html.erb文件:

<h3><%= link_to @album.name %></h3>
<div class="album">
  <%= link_to "Edit", edit_album_path(@album.id) %>
  <%= link_to "Delete", @album, method: :delete, data:{confirm: "Are you sure you want to    delete this album? All photos in it will be permanently deleted!"} %>
</div>
<br><%= link_to "Back", albums_path %>

为清楚起见,这是我的相册控制器代码:

    class AlbumsController < ApplicationController
      def index
        @albums = Album.all
      end

      def new
        @album = Album.new
      end

      def create
        @album = Album.new(album_params)
        @album.save
        redirect_to albums_path
      end

      def show
        @album = Album.find(params[:id])
      end

      def edit
        @album = Album.find(params[:id])    
      end

      def update
        @album = Album.find(params[:id])
          if @album.update(album_params)
            redirect_to album_path(@album.id)
          else
           render 'edit'
          end
      end

      def destroy
        @album = Album.find(params[:id])
        @album.destroy
        redirect_to albums_path
      end

      private

      def album_params
        params.require(:album).permit(:id, :name, :category)
      end
    end

2 个答案:

答案 0 :(得分:1)

在您的索引操作中,您将一系列相册定义为@albums。在show动作中,您只需定义一个@album。这些变量只能在定义它们的操作中访问。

“专辑”在索引视图中的作用原因是每个块都在块的范围内定义了一个本地“专辑”变量。

<% @albums.each do |album| %>
  <div>
    <%= link_to album.name, album_path(album.id) %>    
  </div>
<% end %>

do块之后的|album|表示“对于此迭代,将当前值分配给变量album

答案 1 :(得分:0)

您需要在控制器中设置实例变量。确保在AlbumsController索引操作中设置@albums,在show action中设置@album。 do块使用块变量,而不是实例,因此不需要@。