【问题标题】:how show properly?如何正确显示?
【发布时间】:2012-03-12 13:00:20
【问题描述】:

我必须展示一些属于洞穴的岩石和属于用户的洞穴!看起来很公平,对吧?但是为什么岩石显示页面窗台不认识洞穴?我们开始:

摇滚模特

belongs_to :cave

洞穴模型

has_many :rocks

用户模型

has_one :cave

摇滚控制器

def new 
    @rock = Rock.new
  end

    def show
     @cave = Cave.find(params[:cave_id])
       @rock = @cave.rocks
    end

  def create  
    @rock = current_user.cave.rocks.build(params[:rock]) 
    if @rock.save
      flash.now[:success] = "Ya Man"
      redirect_to :action => :show
    else
      render :new    
  end
end

摇滚表演视图

<h2><%= @rock.cave.name %></h2>

错误

undefined method `cave' for nil:NilClass

【问题讨论】:

  • @ock = current_user.cave.rocks.build(params[:rock]) - 你忘了r

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.1 rubygems


【解决方案1】:

show 操作中,@cave.rocks 返回 nil,因此您将 nil 分配给 @rock。顺便说一句,我猜它会返回一个集合,而你那里不会有摇滚元素,你可能想改用@cave.rocks.first

此外,在 Rocks 控制器上执行 show 动作来获取洞穴 id 并根据它找到岩石是相当奇怪的。更标准的方法是接收 rock id。

【讨论】:

  • 所以我必须将 nil 分配给@rock?但这不应该只是按 id 显示?
  • 不,我只是在描述你在做什么。使用您当前的代码,您没有在数据库中保存任何内容吗?如果你这样做了,那么你应该使用@rock = @cave.rocks.first(如果你想得到第一个;添加存在检查)
  • 是的,我知道了,除了在岩石秀上显示洞穴名称外,一切正常!
  • 是的,谢谢马塞洛,现在我明白了这个相关的表演动作是如何工作的:)
【解决方案2】:

在显示动作中,在你的行中:

@rock = @cave.rocks

您正在(可能)将 ActiveRelation 分配给变量 @rock。 cave.rocks 将返回属于该洞穴的岩石集合。

您可以致电@rock = @cave.rocks.first,但视图中的正常做法是显示与洞穴相关的所有岩石,而不仅仅是第一个。

【讨论】:

  • 嗯!啊,谢谢,现在我明白了!但如果我只是显示洞穴名称,那么我只需指定用户洞穴在岩石上显示动作对吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多