Rails 4:form_for与关联

保罗·赫尔姆

铁轨和红宝石的新手。form_for协会斗争我正在尝试设置允许用户从客户端列表中选择的Rails应用程序。客户端通过has_many :through关系进行关联我的模型按预期工作,可以通过rails控制台将客户端添加到用户。我现在想将此功能移至Web界面。下面的代码是我尝试过的方式,但是对我来说只是没有意义。我不确定哪个控制器动作是正确的动作。我应该POST在客户端的create操作中处理表单吗?我实际上并不想创建一个新客户端,我只希望用户从现有客户端列表中进行选择并创建关联。

我的模型如下:

class Client < ActiveRecord::Base
has_many :users, :through => :user_clients
has_many :user_clients, :dependent => :destroy
end

class User < ActiveRecord::Base
has_many :clients, :through => :user_clients
has_many :user_clients, :dependent => :destroy
end

class UserClient < ActiveRecord::Base
belongs_to :user
belongs_to :client
end

路线如下

resources :clients do
  resources :users
end

resources :users do
  resources :clients
end 

客户控制器

class ClientsController < ApplicationController
  before_action :set_client, only: [:show, :edit, :update, :destroy]

  def index
    if params[:user_id]
      @clients = User.find_by_id(params[:user_id]).clients
    else
      @clients = Client.all
    end
    @clients
  end

  def create
    if params[:user_id]
      user = User.find(params[:user_id])
      client = Client.find_by_id(params[:client_id])
      user.clients << client
      user.save
      redirect_to users_url
    else
      @client = Client.new(client_params)
      @client.save
      redirect_to clients_url
    end
  end
end

客户端视图中的表单

<h1>new.html.erb</h1>
<% if params[:user_id] %>
  <%= form_for([@user,@client]) do |f| %>
  <div class="field">
    <%= f.label :id %><br>
    <%= f.text_field :id %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
  <% end %>
<% else %>
  <%= render 'form' %>
<% end %>
忍者

首先,看一下该gem:Nested Form这也是有关该主题的两个例子但是,如果您愿意构建自己的解决方案,则可以从此处阅读有关嵌套属性的文档开始

希望能帮助到你!

更新关于您的路线和所有内容。

resources :clients do
  resources :users
end

resources :users do
  resources :clients
end 

您已在此处嵌套资源。就像你在你的评论中提及,users/:user_id/clients/newclients/new会导致同样的动作。这就是这种路由工作的方式。您对Rails的处事风格是正确的-在控制器中进行一些令人恐惧的逻辑检查,并且基本上可以在一个动作中执行不同的事情是非常糟糕的由于您的操作(将用户与现有客户端相关联)与一组标准的RESTful操作(update尽管会是最接近的变体)相差很远,因此您需要为资源引入新的操作-例如assign_client您可以这样做:

resources :users do
  resources :clients
  member do
    put :assign_client
  end
end

您可以按照自己喜欢的任何动作呈现表单。但是,如果您想要更独立的内容,则可以创建一对动作(类似于editupdate配对)。第一个将呈现适当的表单,第二个将在服务器上处理该表单。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

清单和更新关联的ID-Rails 4,Form_for

来自分类Dev

Rails多态在视图中发布关联和form_for

来自分类Dev

Rails 4 form_for双嵌套注释

来自分类Dev

Rails form_for NoMethodError

来自分类Dev

Rails4:通过将对象与另一个对象的关联创建和编辑到form_for帮助器

来自分类Dev

Rails 4嵌套资源无法获取form_for

来自分类Dev

Rails 4,img_tag作为form_for控件?

来自分类Dev

Rails4 form_for中的JSON数据类型

来自分类Dev

模板文件未在Rails 4中呈现form_for的结果

来自分类Dev

url选项在rails 4的form_for中不起作用

来自分类Dev

Rails 4 form_for giving incorrect action for patch route

来自分类Dev

Rails4 form_for中的JSON数据类型

来自分类Dev

模板文件未在Rails 4中呈现form_for的结果

来自分类Dev

Rails 4:如何使用form_for和partials

来自分类Dev

Rails:在引导程序模式中为belongs_to关联创建一个form_for

来自分类Dev

Rails slim form_for标签

来自分类Dev

Rails form_for关系模型

来自分类Dev

Rails form_for错误的方法

来自分类Dev

Rails form_for突然结束

来自分类Dev

Rails:form_for缩短代码

来自分类Dev

带有已定义关联的Rails中form_for第一个参数nil错误

来自分类Dev

找不到名称关联-Nested Form Rails 4

来自分类Dev

Rails 4中的关联模型和simple_form

来自分类Dev

关联条件Rails 4

来自分类Dev

关联条件Rails 4

来自分类Dev

构建关联 Rails 4

来自分类Dev

rails 4中的form_for helper的自定义名称属性

来自分类Dev

Rails 4 form_for为修补程序路由提供了错误的操作

来自分类Dev

尝试更新时,Rails 4 form_for select标记将不会保留