在Rails

时间:2017-08-02 05:32:42

标签: ruby ruby-on-rails-4 model

我查看了相关帖子,但无法让我的代码正常工作。我有通过projects_devices表连接的设备和项目模型。我的模型看起来像这样:

class Device < ActiveRecord::Base
  has_many :projects, :through => :projects_devices
  has_many :projects_devices 
  accepts_nested_attributes_for :projects_devices, allow_destroy: true
end


class Project < ActiveRecord::Base
  has_many :devices, :through => :projects_devices
  has_many :projects_devices
  accepts_nested_attributes_for :projects_devices
end


class ProjectsDevice < ActiveRecord::Base
  belongs_to :device
  belongs_to :project
end

我的设备控制器:

def new
  @device = Device.new
  project_device = @device.projects_devices.build
  @projects = Project.all
end

def create
  @device = Device.create(device_params)
end

和我的device_param:

def device_params
  params.require(:device).permit(:name, :projects_devices_attributes => [:id , project_id: []])
end

我的观点:

<%= f.label :Projects_devices %><br>
<%= f.fields_for :projects_devices do |proj| %>
  <%= proj.select(:project_id, [], {},  {class: "form-control projects-devices", multiple: "multiple" } ) do %>
    <% if (@projects)  %>
      <% for @project in @projects  %>
        <%= content_tag(:option, @project.name, value: @project.id) %>
      <% end %>
    <% end %>
  <% end %>
<% end %>

我有两个模型之间的多对多关联。在创建和编辑设备时,我应该能够列出所有可用的项目。并只选择所需的。保存时,应更新projects_devices表。

我有很多问题:

  1. 当我保存新设备时,

    一个。 projects_devices表仅包含device_id但不包含project_idproject_id为空

    湾如果有2个项目并且我只选择了一个项目,那么即使这样,也会创建仅有device_id的两个关联记录(如上所述,缺少project_id)。它应该只创建一个关联。

  2. 编辑新设备时

    一个。项目清单,所有项目清单都是空的。

    湾我看到显示2个选择框而不是项目中的一个(当前有2个项目)。

    ℃。更新设备没有发生。

  3. 我检查了参数:

    "device"=>{"name"=>"ABC",
     "projects_devices_attributes"=>{"0"=>{"project_id"=>["",
     "298486374"]}}},
     "commit"=>"Create Device"}
    

    我的rails日志显示我的应用程序仅插入device_id:

    SQL (0.1ms)  INSERT INTO `projects_devices` (`device_id`) VALUES (980190994)
    

    有人可以帮我解决问题

1 个答案:

答案 0 :(得分:0)

我不确定,但试试这个参数。 也许有帮助。 :)

def device_params
 params.require(:device).permit(:name, :projects_devices_attributes =>[:id, :device_id, :project_id, :_destroy])
end