Rails:如何在子新操作中显示父模型的属性?

时间:2015-10-09 21:04:46

标签: ruby-on-rails associations

我正在尝试在Rails 4中创建一个应用程序。我试图弄清楚如何显示相关属性。

我的目标是让教育工作者创建项目。然后学生可以表达对它们的兴趣。创建项目后,项目展示会包含指向学生可以表达兴趣参与的表单的链接,如下所示:

          <%= link_to  'Join this project', project_student_eoi_path %>

我有一个名为Project.rb的模型和另一个名为Project_student_eoi.rb的模型。

协会是:

Project has many project_student_eois
Project_student_eoi belongs to Project

在我的project_student_eoi表单中,我想显示项目表中的一些属性(project:title和:hero_image)。

我在SO上发现了这个与我类似的问题,并尝试了这个建议。它不起作用。 http://stackoverflow.com/questions/15862365/displaying-attributes-for-associated-models-in-views

在我的project_student_eoi视图#form中,我有:

    <%= project_student_eoi.project.title if project.title %>

    <%= project_student_eoi.project.hero_image.thumb if project.hero_image%>

我实际上有title和hero_image属性 - 它们在项目#show页面中正确显示。我把if语句放入,因为这是来自其他SO帖子的建议。

我收到此错误:

undefined local variable or method `project' for #<#<Class:0x007f9d44d50690>:0x007f9d44a52ce0>

我试过把@&#39; @&#39;在线前看看是否有帮助。我收到这个错误:

  
        <%= @project_student_eoi.project.hero_image.thumb if project.hero_image%>

在这种情况下,我收到此错误:

NameError at /project_student_eois/new
undefined local variable or method `project' for #<#<Class:0x007f9d44d50690>:0x007f9d41d0f788>

我无法找到任何有助于了解如何显示相关属性的资源。我有一本名为Rails 4 Way的书 - 它讲述了很多关于定义关联但没有关于如何使用它们的线索。

Project_student_eoi.rb:

class ProjectStudentEoi < ActiveRecord::Base

  # --------------- associations

  belongs_to :project
  # belongs_to :student

  # --------------- sweeps

  # --------------- validations

  # --------------- class methods

  # --------------- callbacks

  # --------------- instance methods

  # --------------- private methods

end

我只添加了if语句,因为它是上述SO帖子中的建议。

当我尝试:

    <%= @project_student_eoi.project.title %>

    <%= @project_student_eoi.project.hero_image.thumb %>

我收到此错误:

NoMethodError at /project_student_eois/new
undefined method `title' for nil:NilClass

下面的第一组评论表明我正在尝试在project_student_eoi的表单(新操作)中显示现有的项目属性。表单尚未保存,但尚未存在。是否最好在项目中创建另一个视图,在项目视图中嵌套项目学生eoi表单,以便我可以在侧边栏中显示项目详细信息?

如果这是一种有效的方法,我在项目视图文件夹中添加了一个名为&#39;的新文件。 student_eoi.html.erb。在里面,我有这个代码:

<div class="containerfluid">
<%= render 'static/deviselinks'%>
  <div class="row">
    <div class="col-md-10 col-md-offset-1">

      <h1 class="header-project" style="margin-bottom:10%">
        Express your interest
      </h1>
      <div class="col-md-7 col-md-offset-1">

      <%= render 'project_student_eois/form' %>
      </div>

      <div class="col-md-3 col-md-offset-1">
      <div class="uniboxtitle" style="background-color: #f1f1f1; padding:20px ">

            <%= @project.title %>

            <%= @project.hero_image.thumb %>


       </div>
      </div>


    <div class="formminor">
        <%= link_to 'Back', project_path %>
    </div>
    </div>
  </div>
</div>

然后,在我的项目#show page中我有:

<%= link_to  'Join this project', student_eoi_path %>

当我尝试这个时,我收到了这个错误:

NameError at /projects/2
undefined local variable or method `student_eoi_path' for #<#<Class:0x007ff72bc87290>:0x007ff734312c60>

我认为这可能是因为我必须在项目控制器中添加一些东西来处理这个视图 - 我只是不知道那是什么东西。这是一个嵌套在show动作中的行吗,即@student_eoi?我不理解这个过程,也不知道如何从这里解决(如果这是一个可靠的方法)。

另外,我有宁静的路线。这将是我第一次提出并非来自脚手架的观点,所以不确定我是否必须在路线上添加一些东西(目前只是资源:项目)。

我的尝试是:

在我的routes.rb中,我现在有:

resources :projects do
    get 'projects/student_eoi' => 'projects/student_eoi', as => 'student_interest'

我不明白这条线路是什么意思 - 我已经从其他一些例子中抄来了,但它们正在描述不同的问题(所以不知道我是否在错误的轨道上)

在我的projects_controller.rb中,我有:

  def student_eoi

  end

我不知道在这个定义中应该放什么。这个新项目展示的想法是创建一个带有侧边栏的页面,该侧边栏显示关键项目详细信息并保存新project_student_eoi(这是子资源)的表单。

任何人都可以看到我需要做些什么才能让它发挥作用?

表单partial位于我的project_student_eoi视图文件夹中。我在项目视图文件夹中的视图中嵌套该表单的原因是我想在表单旁边的侧栏中显示项目标题和图像。如果表单是新操作,那么它不知道如何找到项目(当我尝试从project_student_eoi表单引用项目时)。我这样做的尝试高于这篇文章的顶部。

这就是我在项目视图文件夹中创建一个新文件的原因:student_eoi.html.erb。

在那,我有:

<div class="containerfluid">
<%= render 'static/deviselinks'%>
  <div class="row">
    <div class="col-md-10 col-md-offset-1">

      <h1 class="header-project" style="margin-bottom:10%">
        Express your interest
      </h1>
      <div class="col-md-7 col-md-offset-1">

      <%= render 'project_student_eois/form' %>
      </div>

      <div class="col-md-3 col-md-offset-1">
      <div class="uniboxtitle" style="background-color: #f1f1f1; padding:20px ">

            <%= @project.title %>

            <%= @project.hero_image.thumb %>


       </div>
      </div>


    <div class="formminor">
        <%= link_to 'Back', project_path %>
    </div>
    </div>
  </div>
</div>

要点是项目视图知道它正在讨论哪个项目,并且从project_student_eoi文件夹中嵌套新的表单操作。

在我的routes.rb中,我现在有:

resources :projects do
    get 'projects/student_eoi' => 'projects/student_eoi', as => 'student_interest'

在我的projects_controller.rb中,我有:

def student_eoi

  end

我不知道在这个定义中应该放什么。这个新项目展示的想法是创建一个带有侧边栏的页面,该侧边栏显示关键项目详细信息并保存新project_student_eoi(这是子资源)的表单。

当我尝试这个时,我收到了这个错误:

ActiveRecord::RecordNotFound at /project_student_eois/2
Couldn't find ProjectStudentEoi with 'id'=2

id 2是我的项目编号,而不是我的projectStudentEoi。此错误指向的行参考是:

def set_project_student_eoi
  @project_student_eoi = ProjectStudentEoi.find(params[:id])
end

任何人都可以看到我需要做些什么才能让它发挥作用吗?

1 个答案:

答案 0 :(得分:0)

你想要显示:title和:hero_image,但只有它们存在?

这有效吗?

<%= @project_student_eoi.project.title %>

如果上述方法有效,则您收到的错误是由if语句引起的。改变这个:

<%= @project_student_eoi.project.title if project.title %>

对此:

<%= @project_student_eoi.project.title if @project_student_eoi.project.title %>

错误是因为project不是视图本身的有效方法或变量。