2016-07-25 2 views
0

У меня есть модель клиента и book_room модельребенка Обновления атрибутов рельсов

class Customer < ApplicationRecord 
    has_many :book_rooms 
    accepts_nested_attributes_for :book_rooms 
end 

class BookRoom < ApplicationRecord 
    belongs_to :customer 
end 

в контроллере book_room создать метод от родительского

class BookRoomsController < ApplicationController 
def create 
    @customer = Customer.find(params[:customer_id]) 
    @customer_room = @customer.book_rooms.create(book_rooms_params) 
    flash[:notice] = "Customer has been added to room" 
    redirect_to customer_path(@customer) 
end 
def destroy 
    @customer = Customer.find(params[:customer_id]) 
    @customer_room = @customer.book_rooms.find(params[:id]) 
    @customer_room.destroy 
    flash[:notice] = "Customer room has been deleted" 
    redirect_to customer_path(@customer) 
end 
def edit 
    @customer = Customer.find(params[:customer_id]) 
end 
def update 
    @customer = Customer.find(params[:customer_id]) 
    @customer.book_rooms.update(book_rooms_params) 
    flash[:notice] = "Customer has checked out" 
    redirect_to @customer 
end 
private 
def book_rooms_params 
    params.require(:book_room).permit(:room, :first_name, :last_name, :phone_number, :checked_out) 
end 

конца

в шоу клиентов странице

<%= form_for [@customer, @customer.book_rooms.build] do |f| %> 
<% @room = Room.all %> 
<%= f.label "Room: "%> 
<%= f.select(:room, @room.collect { |a| [a.room_number, a.id] }) %> 
<%= f.submit "Enter" %> 
<div class="col-md-12"><%= render @customer.book_rooms.order("created_at DESC") %></div> 

Это работает отлично, и все дочерние объекты создаются. Теперь, когда я пытаюсь изменить ребенок атрибуты не обновляет вообще

ЭРВЫ редактирование формы в странице редактирования book_room/действие

<%= form_for @customer do |f| %> 
<%= f.fields_for :book_rooms, @customer.book_rooms do |f| %> 
    <%= f.check_box :checked_out %> 
<% end %> 
<%= f.submit "Enter" %> 

есть что-то я делаю не так? почему он не обновляется?

Клиенты контроллер

class CustomersController < ApplicationController 
before_action :set_customer, only: [:show, :edit, :update, :destroy] 
# POST /customers.json 
def create 
@customer = Customer.new(customer_params) 
respond_to do |format| 
    if @customer.save 
    format.html { redirect_to @customer, notice: 'Customer was successfully created.' } 
    format.json { render :show, status: :created, location: @customer } 
    else 
    format.html { render :new } 
    format.json { render json: @customer.errors, status: :unprocessable_entity } 
    end 
end 
end 
def update 
respond_to do |format| 
    if @customer.update(customer_params) 
    format.html { redirect_to @customer, notice: 'Customer was successfully updated.' } 
    format.json { render :show, status: :ok, location: @customer } 
    else 
    format.html { render :edit } 
    format.json { render json: @customer.errors, status: :unprocessable_entity } 
    end 
    end 
end 

private 
# Use callbacks to share common setup or constraints between actions. 
def set_customer 
    @customer = Customer.find(params[:id]) 
end 

# Never trust parameters from the scary internet, only allow the white list through. 
def customer_params 
    params.require(:customer).permit(:first_name, :last_name, :phone_number, :sex, :book_rooms_attributes => [:checked_out]) 
end 
+0

Вы только показываете свое действие 'create' .. где ваше действие' update' и что находится в вашем методе 'book_rooms_params'? –

+0

У вас есть клиент-контролер? обычно, '<% = form_for @customer do | f | %> 'через клиента/[customer_id] (обновление). –

+1

Хорошо, вам нужно добавить ': id' внутри': book_rooms_attributes => [: checked_out] '. После этого вы сможете обновить. иначе каждый раз, когда вы закончите с новыми записями. –

ответ

1

В контроллере клиентов: Попробуйте изменить ваши функции customer_params как:

def customer_params 
    params.require(:customer).permit(:first_name, :last_name, :phone_number, :sex, {:book_rooms => [:checked_out]}) 
end 

Для более экспликации см here

1

Измените метод update на:

def update 
    @customer = Customer.find(params[:customer_id]) 
    if @customer.update_attributes(customer_params) 
    flash[:notice] = "Customer has checked out" 
    redirect_to @customer 
    else 
    ...redirect to edit page with a flash error message ... 
    end 

end 

Вам также необходимо изменить страницу редактирования.

<%= form_for(:customer, :url => {:action => 'update', :id => @customer.id}, :method => 'PUT') do |f| %>

1

Попробуйте изменить URL для обновления и изменения метода к patch вы пойти обновить метод.

<%= form_for :customer, url: customer_path(@customer),method: :patch do |f| %> 
    <%= f.fields_for :book_rooms, @customer.book_rooms do |f| %> 
     <%= f.check_box :checked_out %> 
    <% end %> 
<%= f.submit "Enter" %> 
Смежные вопросы