2013-07-26 3 views
2

Я немного Rails noob, и у меня проблемы с решением проблемы.Rails 3 проблема с best_in_place и вложенными атрибутами

Я использую Rails 3.2.13 со следующими драгоценными камнями (в дополнении к драгоценным камням по умолчанию):

gem 'devise' 
gem 'cancan' 
gem 'cocoon' 
gem 'best_in_place' 

Я использую кокон для работы с вложенными моделями, в данном случае у меня есть (разработать) пользователь, который has_many проектов и каждого проекта has_many задач.

Я могу получить всю информацию для отображения (и становятся доступны для редактирования по щелчку) с:

<% @project.tasks.each do |task| %> 
<%= best_in_place task, :description, :path => tasks_path, :type => :input %> 
<% end %> 

Моя проблема заключается в том, что я не могу best_in_place, чтобы сохранить обновления для моего вложенной задачи атрибуты.

Модель проекта:

class Project < ActiveRecord::Base 
    belongs_to :user 

    has_many :tasks 

    attr_accessible :description, :name, :tasks_attributes, :user_id, :tasks 
    accepts_nested_attributes_for :tasks, :reject_if => :all_blank, :allow_destroy => true 
end 

Задача Модель:

class Task < ActiveRecord::Base 
    belongs_to :project 

    attr_accessible :description, :done, :hours 
end 

Контроллер проекта:

class ProjectsController < ApplicationController 
    before_filter :authenticate_user! 

    def show 
    @project = Project.find(params[:id]) 

    respond_to do |format| 
     format.html # show.html.erb 
     format.json { render :json => @project } 
    end 
    end 

def update 
    @project = Project.find(params[:id]) 

    respond_to do |format| 
     if @project.update_attributes(params[:project]) 
     format.html { redirect_to @project, :notice => 'Project was successfully updated.' } 
     #format.json { head :no_content } 
     format.json { respond_with_bip(@project) } 
     else 
     format.html { render :action => "edit" } 
     #format.json { render :json => @project.errors, :status => :unprocessable_entity } 
     format.json { respond_with_bip(@project) } 
     end 
    end 
    end 
end 

Проекты -> show.html.erb:

<% @project.tasks.each do |task| %> 
    <li class="module-list-item ui-state-default clear"> 
    <section class="task-name left"> 
     <%= best_in_place task, :description, :path => tasks_path, :type => :input %> 
    </section> 
    </li> 
<% end %> 
+0

Что находится в ваших параметрах [] при обновлении? возможно, best_in_place отправляет неправильные параметры, вероятно, ничего в параметрах [: project] и update_attributes (params [: project]) не работает – stef

ответ

0

https://github.com/bernat/best_in_place/issues/51 Согласно этому не поддерживается best_in_place.

Автор gem утверждает, что редактирование на месте должно только модифицировать атрибут одной модели, поэтому изменение атрибутов другой модели не было в объеме.

Мое мнение: Лично я сожалею об этом решении.

1

Хотя это использование официально не поддерживается (как указывает @Ich), существует обходное решение. Нет необходимости в каких-либо дополнительных контроллерах. Вам просто нужно передать параметр param в best_in_place.

class Unicycle < AR::Base 
    has_one :wheel 
    accepts_nested_attributes_for :wheel, update_only: true 
end 

best_in_place unicycle.wheel, :last_rotation, 
    path: unicycle_path(unicycle.id), type: :input, 
    param: "unicycle[wheel_attributes]" 

Обратите внимание, что это немного более сложным для Car, который has_many :wheels (или для Unicycle что has_one :wheel где update_only не будет работать для вас).

car.wheels.each do |wheel| 
    best_in_place wheel, :last_rotation, 
    path: car_path(car.id), type: :input, 
    param: "car[wheel_attributes][id]=#{wheel.id}&car[wheel_attributes]" 
    # Note that you have to pass the ID of the wheel in this case 
end 

Работает с v3.0.3, возможно, с гораздо более ранними версиями, но я не тестировал.