Rails ajax表单与连接表关联

时间:2014-02-14 15:05:04

标签: ruby-on-rails ajax ruby-on-rails-3

我正在尝试在rails中的两个模型之间构建一个'ajaxy'形式。这里是相关的文件和代码片段......

我的模特

ActiveRecord::Schema.define(:version => 20140214134314) do

  create_table "group_shots", :force => true do |t|
    t.integer  "shot_id"
    t.integer  "group_id"
    t.datetime "created_at", :null => false
    t.datetime "updated_at", :null => false
  end

  create_table "groups", :force => true do |t|
    t.string   "name"
    t.datetime "created_at", :null => false
    t.datetime "updated_at", :null => false
  end

  create_table "shots", :force => true do |t|
    t.string   "name"
    t.datetime "created_at", :null => false
    t.datetime "updated_at", :null => false
  end

end

的应用程序/视图/组/ show.html.erb

  <b>Name:</b>
  <%= @group.name %>
<%= link_to 'New Shot', new_shot_path, id: "new_shot", remote: true %></br>

的应用程序/视图/张/ new.js.erb

$('#new_shot').hide().after('<%= j render("form") %>');

的应用程序/控制器/ shots_controller.rb

 def create
    @shot = Shot.new(params[:shot])

    respond_to do |format|
      if @shot.save
        GroupShot.create! :shot_id => @shot.id

 def new
    @shot = Shot.new
 end

我的最终目标是当用户正在查看组(显示操作/视图)时,他们可以添加与该组关联的镜头,因此当用户添加镜头时,在group_shot中创建正确的条目表

您可以在镜头控制器中看到,当保存镜头时,我正在成功创建组/镜头表中的新条目。我得到的是shot_id,但不是group_id。这就是问题,如何在此视图/控制器中获取group_id。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

我的建议是将group_id作为参数传递给groups_controller中的new_shot_path调用#show view:

new_shot_path(group_id: @group)

然后使用hidden_​​field_tag将其作为您在shots_controller#new视图中使用的表单中的隐藏字段包含在内:

<%= hidden_field_tag 'group_id', @group.id %>

然后将其包含在您对ShotShot#create的创建方法中对GroupShot #create的调用中:

GroupShot.create! :shot_id => @shot.id, :group_id => params[:group_id]

请记住,你在shot_controller #create中做了两件事 - 创建镜头并将其关联回组,这可能有点不正统。从您的代码中可以看出,如果没有关联的组,则永远不会创建Shot。如果您的起点总是来自查看组(然后将镜头添加到选定的组),您可能需要考虑将其移动到groups_controller,如#add_shot,但这将取决于您的应用程序的其余部分是如何构建的