Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails有许多贯穿形式_Ruby On Rails_Forms_Has Many Through - Fatal编程技术网

Ruby on rails Rails有许多贯穿形式

Ruby on rails Rails有许多贯穿形式,ruby-on-rails,forms,has-many-through,Ruby On Rails,Forms,Has Many Through,在读了几个小时的《stackoverflow》和《railscasts》之后,我决定发帖。这个问题与这里的许多其他问题非常相似,但我不明白。 这是我第一次通过交往获得很多东西 class User < ActiveRecord::Base ... has_many :affiliations has_many :sublocations, through: :affiliations ... end class Sublocation < ActiveRecord::Base ..

在读了几个小时的《stackoverflow》和《railscasts》之后,我决定发帖。这个问题与这里的许多其他问题非常相似,但我不明白。 这是我第一次通过交往获得很多东西

class User < ActiveRecord::Base
...
has_many :affiliations
has_many :sublocations, through: :affiliations
...
end

class Sublocation < ActiveRecord::Base
...
has_many :affiliations
has_many :users, through: :affiliations
...
end

class Affiliations < ActiveRecord::Base
...
belongs_to :user
belongs_to :sublocation
...
end
class用户
“从属关系”表具有常用的“用户标识”和“子位置标识”列。它还有一个名为“default”的布尔列。 在我的“新建/编辑用户”表单中,我需要通过复选框选择一个或多个子位置,并包括将子位置标记为“默认”的方法

再一次,我读了一个又一个例子,但有些东西并没有在我的大脑中“点击”。我不一定要寻找一个精确的解决方案,而是朝着正确的方向前进

非常感谢,, CRS

我的建议:

创建用户表单以设置
用户
子位置

我假设子位置已预先填充

用户\u控制器.rb

def new
    @user = User.new
    @sublocations = Sublocation.all
    respond_to do |format|
      # what ever
    end
end

def create
    @user = User.new(params[:user])
    params[:sublocation_ids].each do |key, value|
      @user.affiliations.build(sublocation_id: value)
    end
    respond_to do |format|
      if @user.save
        # what ever
      else
        # what ever
      end
    end
 end

def show
    @user = User.find(params[:id])
    @affiliations = @user.affiliations
end

def set_default
    affiliation = Affiliation.find(params[:affiliation_id])
    Affiliation.where(user_id: params[:user_id]).update_all(default: false)
    affiliation.toggle!(:default)
    redirect_to affiliation.user, notice: "Default sublocation set"
 end
resources :users do
  member do
   put "set_default"
  end
end 
users/\u form.html.haml

= form_for @user do |f|

  .field
    # fields for user attributes

  .field

    %h1 Sublocations

    = f.fields_for "sublocations[]" do
      - for sublocation in @sublocations
        = label_tag sublocation.name
        = check_box_tag "sublocation_ids[#{sublocation.name}]", sublocation.id, @user.sublocations.include?(sublocation)
  .actions
    = f.submit 'Save'
= form_tag user_set_default_path(@user), method: :put do
  %table
    %tr
      %th Sublocation
      %th Default?
    - @affiliations.each do |affiliation|
      %tr
        %td= affiliation.sublocation.name
        %td= radio_button_tag :affiliation_id, affiliation.id, affiliation.default? ? {checked: true} : nil

  = submit_tag "Set default"
然后,也许在用户显示页面上,列出它们的所有子位置,并为它们创建一个表单来设置默认值

users/show.html.haml

= form_for @user do |f|

  .field
    # fields for user attributes

  .field

    %h1 Sublocations

    = f.fields_for "sublocations[]" do
      - for sublocation in @sublocations
        = label_tag sublocation.name
        = check_box_tag "sublocation_ids[#{sublocation.name}]", sublocation.id, @user.sublocations.include?(sublocation)
  .actions
    = f.submit 'Save'
= form_tag user_set_default_path(@user), method: :put do
  %table
    %tr
      %th Sublocation
      %th Default?
    - @affiliations.each do |affiliation|
      %tr
        %td= affiliation.sublocation.name
        %td= radio_button_tag :affiliation_id, affiliation.id, affiliation.default? ? {checked: true} : nil

  = submit_tag "Set default"
routes.rb

def new
    @user = User.new
    @sublocations = Sublocation.all
    respond_to do |format|
      # what ever
    end
end

def create
    @user = User.new(params[:user])
    params[:sublocation_ids].each do |key, value|
      @user.affiliations.build(sublocation_id: value)
    end
    respond_to do |format|
      if @user.save
        # what ever
      else
        # what ever
      end
    end
 end

def show
    @user = User.find(params[:id])
    @affiliations = @user.affiliations
end

def set_default
    affiliation = Affiliation.find(params[:affiliation_id])
    Affiliation.where(user_id: params[:user_id]).update_all(default: false)
    affiliation.toggle!(:default)
    redirect_to affiliation.user, notice: "Default sublocation set"
 end
resources :users do
  member do
   put "set_default"
  end
end 

希望这能帮助你,或者至少让你走上正确的道路

我不认为在从属关系表中应该有一个布尔字段“default”。您希望将子位置设置为默认值,而不是从属关系。不确定其是否正确,您需要在用户中将一个:sub_location设置为默认值。因此,请检查是否可以将“has_one:sub_location”添加到用户(这将是默认值)。默认值必须在affiliations表中,因为每个用户都可以有不同的默认子位置。另外,我不知道我是否可以用一个有一个和多个在同一个模型上的另一个模型。这让我在我的道路上很好。我想在新用户表单中设置默认值,因为用户不能设置自己的默认子位置,但同时,在创建用户后,我将重定向到“设置默认值”表单。非常感谢。