【问题标题】:Passing instance variable from Model to View to Controller in Rails在 Rails 中将实例变量从模型传递到视图到控制器
【发布时间】:2015-04-07 19:19:48
【问题描述】:

基本应用。在本案例课程中尝试制作一个单击并显示下一页的按钮。

在我的控制器中,我有:

def show 
  @lesson = Lesson.find(params[:id])
end 

在我看来 (show.html.erb) 我有:

...
<p><%= link_to 'Previous', Lesson.previous(@lesson) %></p>
<p><%= link_to 'Next', Lesson.next(@lesson) %></p>
...

在我的模型中,我有:

def self.next(current_lesson)
  current_lesson.number + 1
end

def self.previous(current_lesson)
  current_lesson.number - 1
end 

我的架构包含一个整数列。

但是,这会因 'undefined method `to_model' for 0:Fixnum' 而出错,当我在控制台中运行 @lesson 时,它会显示为 nil。

我也试过这个:

def self.next
  current_lesson = Lesson.find(@lesson.id)
  next_lesson = current_lesson.number + 1 
end 

def self.previous 
  current_lesson = Lesson.find(@lesson.id)
  previous_lesson = current_lesson.number - 1
end

然而,这成功地将实例变量传递给模型,因为在控制台中 @lesson 返回正确的值但它无法调用该方法。

想法?

编辑:尝试了另一个解决方案:

我尝试将其更改为实例方法而不是类方法。所以在视图中我设置了@lesson.previous 和@lesson.next。在模型中我这样做了:

def next
  self.number + 1
end 

def previous
  self.number - 1
end

但是唉,我又得到了@instance nil 错误。

【问题讨论】:

  • 奇怪的是,如果我从包含任何内容的视图中传递一个参数,实例变量的值就会丢失并返回 nil。因此,在我看来,我需要传递实例变量,但一旦我接受该值作为参数,它就会丢失。谁能解释我错过了什么?
  • 您的问题是您正在调用link_to "Next", 12(假设 current_lesson.number 为 11),而 rails 不知道该怎么做。它应该怎么做?
  • 好的。我当前的 URL 是课程/2,我想接下来进入课程/3 和以前的课程/1。这只是一种说去下一课的方式。

标签: ruby-on-rails ruby


【解决方案1】:

self.next & self.previous 返回整数而不是课程。让他们返回下一个和上一个课程对象,它应该可以工作。即

    Lesson.find_by_number(self.number-1)

【讨论】:

    【解决方案2】:

    在函数中

    def self.next
      current_lesson = Lesson.find(@lesson.id)
      next_lesson = current_lesson.number + 1
    end
    

    您将返回一个 Fixnum 而不是一个课程对象。

    如果您想返回 id 1 更高的课程,您可能最好执行以下操作:

    def next
      Lesson.find(self.number + 1)
    end
    

    【讨论】:

    • 这是有道理的。但是当我尝试重新加载时,它显示“找不到具有 'id'=1 的课程”。
    【解决方案3】:

    您收到错误的原因是 Lesson.nextLesson.previous 返回整数而不是课程对象。如果您想继续使用 nextprevious 类方法,您可以在视图中进行以下更改

    <p><%= link_to 'Previous', lesson_path(Lesson.previous(@lesson)) %></p>
    <p><%= link_to 'Next', lesson_path(Lesson.next(@lesson)) %></p>
    

    【讨论】:

      猜你喜欢
      • 2012-06-29
      • 1970-01-01
      • 2020-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-10
      相关资源
      最近更新 更多