Rails:通过不填充的表单进行belongs_to关联

时间:2015-04-09 20:35:27

标签: ruby-on-rails ruby rails-activerecord has-many belongs-to

我正在为我班级Project的控制器工作。它与belongs_toClient的关系。

我不确定为什么会发生这种情况,但是当我通过表单创建新项目时,会为其分配name,但没有fee而没有{{1 }}。

以下是相关代码:

项目控制器

client_id

项目/新视图

class ProjectsController < ApplicationController

  def index
  end

  def show
  end

  def new
    @project = Project.new 
  end

  def edit
  end

  def create
    @project = Project.new(project_params)
    if @project.save
      redirect_to projects_url
    else
      render 'new'
    end
  end

  def update
  end

  def destroy
  end

  private 

  def project_params
    params.require(:project).permit(:name, :feee, :client_id)
  end
end

项目模型

<div id="newproject-form">
    <h1>Create a project</h1>
    <%= form_for @project do |p| %>
        <div id="newproject-form-input">
            <ul>
                <li><%= p.label :name, "Project name: " %><br>
                <%= p.text_field :name, size: 40 %></li>

                <li><%= p.label :fee, "Fee: " %><br>
                <%= p.text_field :fee %></li>

                <li><%= p.label :client, "Client name: " %><br>
                <%= collection_select(:client_id, :name, current_user.clients, :id, :name) %></li>

                <li><%= p.submit "Create project", class: "form-button" %>, or <%= link_to "Cancel", 
                root_path %></li>
            </ul>
        </div>
    <% end %>
</div>

2 个答案:

答案 0 :(得分:2)

您必须在表单构建器上调用collection_select

# change this
<%= collection_select(:client_id, :name, current_user.clients, :id, :name) %>
# to this
<%= p.collection_select(:client_id, current_user.clients, :id, :name) %>

通过使用FormBuilder p,您告诉collection_select您正在编辑Project对象(请参阅p.object以返回表单构建器的对象)。


如果查看collection_select文档(http://apidock.com/rails/ActionView/Helpers/FormOptionsHelper/collection_select):

  

collection_select(object,method,collection,value_method,text_method,options = {},html_options = {})

如果您自己调用collection_select(而不是form_for方法提供的表单构建器),则必须将对象的名称作为第一个参数。在您的情况下,生成collection_select(:project, :client_id, #etc.)等参数会params[:project][:client_id]

答案 1 :(得分:1)

要获得工作费用,您需要在project_params

中修正拼写错误

对于client_id,请尝试以下方法:

内部观点/项目/新

 <%= collection_select(:project, :client_id, current_user.clients, :id, :name) %>

OR

<%= p.collection_select(:client_id, current_user.clients, :id, :name) %>

当你使用collection_select时,前两个参数是集合描述的对象和属性(在本例中是你的project对象和client_id属性)所以当你写{{1 Rails实际上正在接收一个看起来像collection_select(:client_id, :name, current_user.clients, :id, :name)的对象,你完全忽略它,而我的代码将:client_id添加到项目对象中,这是你的代码所期望的。

使用表单构建器(在这种情况下,您的{ client_id: {name: 'Something'} }对象)可以省略&#39;对象&#39; param,因为表单构建器已经知道它为其构建表单的对象。