问题:
我在数据库中有2个表 - 用户和项目。这是一个HABTM关系,但我使用的是has_many:而是因为我想在连接上添加一些额外的信息 - 特别是用户在他们有权访问的项目中扮演的角色。
例如,用户1可以作为管理员访问项目1,并可以作为访客访问项目2.
现在,我有一个基本的登录系统,我知道@current_user。因此,当该用户使用表单创建新项目时,会自动授予他们访问权限。这工作--Rails将user_id和project_id添加到ProjectRegistrations表,我可以随后查询并返回所有用户项目的列表,反之亦然。但是,当项目创建时,我正在尝试将一个字符串分配给连接表的“角色”列(它根本就不是在玩球!)
好的,这是新项目表格。它非常简单 - 用户输入项目名称的单个文本字段。还有2个隐藏字段,一个用于当前用户ID,另一个用于该用户在项目中的角色。现在,我刚刚将角色添加为字符串,同时我将功能运行起来。如上所述,用户ID位工作正常,它是不玩球的角色字段。
<div class="field">
<%= f.label :name %><br>
<%= f.text_field :name %>
</div>
<div class="field">
<%= hidden_field_tag "project[user_ids][]", @current_user.id %>
</div>
<div class="field">
<%= hidden_field_tag "project[role]", "Admin" %>
</div>
<div class="actions">
<%= f.submit %>
</div>
这是我的projects_controller代码:
def create
@project = Project.new(project_params)
respond_to do |format|
if @project.save
format.html { redirect_to @project, notice: 'Project was successfully created.' }
else
format.html { render :new }
end
end
end
处理params的私有方法(在同一个文件中):
def project_params
params.require(:project).permit(:name, {:user_ids => []}, project_registrations_attributes: [:role])
end
rails控制台输出:
Started POST "/projects" for ::1 at 2015-11-19 16:12:59 +0000
Processing by ProjectsController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"...", "project"=>{"name"=>"Test", "user_ids"=>["15"], "role"=>"Admin"}, "commit"=>"Create System"}
*then it does some user stuff here*
and does the SQL INSERTS:
SQL (0.3ms) INSERT INTO `projects` (`name`, `created_at`, `updated_at`) VALUES ('Test', '2015-11-19 16:12:59', '2015-11-19 16:12:59')
SQL (0.1ms) INSERT INTO `project_registrations` (`user_id`, `system_id`, `created_at`, `updated_at`) VALUES (15, 94, '2015-11-19 16:12:59', '2015-11-19 16:12:59')
令我困惑的是,该参数正在将其纳入请求,但Rails实际上并未将其插入到连接表中。但是,它是插入相关的用户和项目ID。该表看起来像这样:
+----+---------+------------+---------+------+---------------------+---------------------+
| id | user_id | project_id | summary | role | created_at | updated_at |
+----+---------+------------+---------+------+---------------------+---------------------+
| 83 | 15 | 91 | NULL | NULL | 2015-11-19 15:23:31 | 2015-11-19 15:23:31 |
| 84 | 15 | 92 | NULL | NULL | 2015-11-19 16:12:06 | 2015-11-19 16:12:06 |
| 85 | 15 | 93 | NULL | NULL | 2015-11-19 16:12:40 | 2015-11-19 16:12:40 |
| 86 | 15 | 94 | NULL | NULL | 2015-11-19 16:12:59 | 2015-11-19 16:12:59 |
+----+---------+------------+---------+------+---------------------+---------------------+
我已经阅读了网站上几乎所有提到联接表的问题,但没有更接近使其工作。
我尝试过的一些事情:
一些指示将非常感谢!我对Rails很陌生,所以我确定它真的很小。
谢谢!
编辑1
建议我尝试更改表单中的代码行:
<%= hidden_field_tag "project[role]", "Admin" %>
到
<%= hidden_field_tag "project[project_registrations_attributes][role]", "Admin" %>
但是,现在抛出“没有将Symbol隐式转换为整数”错误。现在研究修复(同时欢迎评论/提示......)
编辑2
添加项目模型以供参考:
class Project < ActiveRecord::Base
has_many :project_registrations, dependent: :destroy
has_many :users, :through => :project_registrations
accepts_nested_attributes_for :users, :project_registrations
end