我有点像Rails noob而且我在解决问题时遇到了一些麻烦。
我正在使用Rails 3.2.13以及以下宝石(除了默认宝石):
gem 'devise'
gem 'cancan'
gem 'cocoon'
gem 'best_in_place'
我正在使用cocoon来处理嵌套模型,在这种情况下,我有一个(设计)用户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
项目 - &gt; 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 :(得分: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
some string 1
some string 2
some string 3
some string x
some string y
some string z
...
不适合你)。
(?isx: \h* (.+)? \h* (?:(?:\n|\r\n){2,} \h* (.+))? \s*)
适用于v3.0.3,可能还有更早的版本,但我还没有测试过。
答案 1 :(得分:0)
根据https://github.com/bernat/best_in_place/issues/51,best_in_place不支持此功能。
gem的作者认为,编辑只应修改一个模型的属性,因此更改另一个模型的属性不在范围内。
我的意见:我个人对此决定感到遗憾。