我正在为我班级Project
的控制器工作。它与belongs_to
有Client
的关系。
我不确定为什么会发生这种情况,但是当我通过表单创建新项目时,会为其分配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>
答案 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,因为表单构建器已经知道它为其构建表单的对象。