У меня проблемы с вводом данных в мою новую модель.
Я создал новую модель, чтобы я мог назначать пользователей филиалам.
У меня есть модель Users, Affiliates и UserAffiliates.
UserAffiliates
belongs_to :users
belongs_to :affiliates
Пользователь
has_and_belongs_to_many :user_affiliate
has_and_belongs_to_many :affiliate, through: :user_affiliate, optional: true
Партнёрские
has_many :user_affiliates
has_many :users, through: :user_affiliates
Как это работает, у партнера может быть много пользователей, но у пользователя всегда будет только один партнер. Затем у меня есть столбец комиссионных в таблице UserAffiliates, чтобы установить комиссию для каждого пользователя в отдельности.
Я создал эту форму, и она, кажется, не работает (которая основана на <% @users.each do |user| %>
, который проходит через каждого пользователя в таблице:
<%= form_for user, remote: true do |f| %>
<% f.fields_for :user_affiliates, remote: true do |f| %>
<%= f.text_field :affiliate_id, class: "form-control" %>
<%= f.submit "Add Affiliate", data: {confirm: "Are you sure?"}, class: "btn btn-light" %>
<% end %>
<% end %>
Я получаю эту ошибку:
Parameters: {"utf8"=>"✓", "user"=>{"user_affiliates"=>{"affiliate_id"=>"1"}}, "commit"=>"Add Affiliate", "id"=>"2"}
User Load (0.7ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2 [["id", 2], ["LIMIT", 1]]
↳ app/controllers/users_controller.rb:58
Completed 500 Internal Server Error in 62ms (ActiveRecord: 6.4ms)
ArgumentError (wrong number of arguments (given 0, expected 1..2)):
app/controllers/users_controller.rb:88:in `[]'
app/controllers/users_controller.rb:88:in `user_params'
app/controllers/users_controller.rb:61:in `block in update'
app/controllers/users_controller.rb:60:in `update'
Параметры контроллера пользователя :
def user_params
params.require(:user).permit(:name, :approved, :seller, :buyer, :admin, :stripe_account, :email, :password, :password_confirmation, :role, :affiliate_id, :affiliate_ids [], :user_affiliates, :commission)
end
Моя форма неверна?
Я хочу иметь возможность перечислять пользователей в таблице как user.admin, иметь текстовое поле и вводить affiliate_id, а затем вводить user_id и affiliate_id в таблицу UserAffiliate. Я также хочу добавить комиссионные ставки, которые могут изменить и user.admin, и Affiliate.
Как я могу сделать это правильно?
Обновление:
Я исправил свои параметры, но все еще есть ошибки:
Титулы:
def user_params
params.require(:user).permit(:name, :approved, :seller, :buyer, :admin, :stripe_account, :email, :password, :password_confirmation, :role, :affiliate_id, :user_affiliates, :affiliate, :commission, affiliate_ids: [])
end
Ошибка:
Started PATCH "/users/2" for 127.0.0.1 at 2019-01-10 21:20:53 -0500
Processing by UsersController#update as JS
Parameters: {"utf8"=>"✓", "user"=>{"user_affiliates"=>{"affiliate_id"=>"1"}}, "commit"=>"Add Affiliate", "id"=>"2"}
User Load (0.8ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2 [["id", 2], ["LIMIT", 1]]
↳ app/controllers/users_controller.rb:58
Unpermitted parameter: :user_affiliates
(0.5ms) BEGIN
↳ app/controllers/users_controller.rb:61
(0.1ms) ROLLBACK
↳ app/controllers/users_controller.rb:61
Completed 406 Not Acceptable in 21ms (ActiveRecord: 5.3ms)
ActionController::UnknownFormat (ActionController::UnknownFormat):
app/controllers/users_controller.rb:60:in `update'
Я попытался изменить его на user_affiliate (non pluar) и множественное число во всех контроллерах, моделях и формах. Что мне нужно сделать для обновления на контроллере пользователей?
Обновление контроллера пользователя:
def update
@user = User.find(params[:id])
# @affiliate = current_affiliate
respond_to do |format|
if @user.update(user_params) # <- you'll need to define these somewhere as well
if @user.admin?
format.html { redirect_to '/admin/users', notice: "yahoo" }
format.json { render json: @user }
# elsif @affiliate
# format.html { redirect_to '/a/clients', notice: "yahoo" }
# format.json { render json: @user }
else
format.html { render :edit }
format.json { render json: { errors: @user.errors }, status: :unprocessable_entity }
end
end
end