其他数据未保存到富连接表,但主键已正确保存

时间:2015-11-19 17:13:01

标签: mysql ruby-on-rails ruby join

问题:

我在数据库中有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 |
+----+---------+------------+---------+------+---------------------+---------------------+

我已经阅读了网站上几乎所有提到联接表的问题,但没有更接近使其工作。

我尝试过的一些事情:

  1. 我已将'accepts_nested_attributes_for'添加到相应的中 楷模。
  2. 我在project_params方法中使用了格式,但是从我现在阅读的方式来看,这是正确的方法。
  3. 我有这样写的表单代码:&lt;%= hidden_​​field_tag“project_registration [role]”,“Admin”%&gt;。这确实改变了控制台输出的内容,但它仍然没有将数据保存到表中。
  4. 一些指示将非常感谢!我对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
    

0 个答案:

没有答案