Ruby on rails rails—仅更新部分模型的_属性;文件上传
我想添加一个用户的能力,以有几个图片与他/她的用户帐户 我有以下课程:Ruby on rails rails—仅更新部分模型的_属性;文件上传,ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,我想添加一个用户的能力,以有几个图片与他/她的用户帐户 我有以下课程: class User < ActiveRecord::Base has_many :assets accepts_nested_attributes_for :assets end class Asset < ActiveRecord::Base belongs_to :assetable, :polymorphic => true belongs_to :user end 表格: &l
class User < ActiveRecord::Base
has_many :assets
accepts_nested_attributes_for :assets
end
class Asset < ActiveRecord::Base
belongs_to :assetable, :polymorphic => true
belongs_to :user
end
表格:
<%= form_for @user do |u| %>
<%= u.fields_for :assets do |asset| %>
<%= asset.file_field :asset %>
<%= asset.text_field :description %><br />
<% end %>
<%=u.submit %>
<% end %>
但我得到了一个错误:
nil:NilClass的未定义方法“update\u attributes”
因为我只有资产字段,所以我需要做什么特殊的事情吗?另外,由于用户存在,这会导致问题吗?
基本上:
asset:
user_id:
assetable_type:
assetable_id:
任何帮助都将不胜感激。不要做太多的事情
thx
编辑#1
class UsersController
thx好的-这里的代码有一些问题。我强烈建议您阅读和指南,以获得有关这方面的更多信息 在任何情况下,您都会收到错误,因为您所在的表单将尝试使用
users\update
中的userscoontroller
操作
你有两个选择。一种是为自定义操作创建必要的路由,或者您可以创建一个嵌套资源,并创建一个用于添加资源的表单
在这种情况下,您可以这样做:
<%= form_for @asset do |f| %>
<%= f.file_field :asset %>
<%= f.text_field :description %><br />
<%=f.submit %>
<% end %>
在routes.rb中
resources :users do
resources :assets, :only => [:new, :create] # Or any other actions you might want. It's best practise to limit these.
end
然后,在AssetController
中,您可以执行类似的操作:
def new
@asset = Asset.new
end
def create
@asset = Asset.new(params[:asset])
@asset.user_id = params[:user_id] if params[:user_id]
@asset.save!
end
您的表单将如下所示:
<%= form_for @asset do |f| %>
<%= f.file_field :asset %>
<%= f.text_field :description %><br />
<%=f.submit %>
<% end %>
您能在控制器中粘贴相关操作的代码吗?谢谢回答。那么,嵌套资源的url是否为/users/1/assets/edit
?此外,这会处理所属对象和多态关系吗?thx再次关注这一点——我知道它正在使用用户更新;这就是使用嵌套属性的目的。由于id是在post的参数中传递的,因此它似乎应该可以工作。
def new
@asset = Asset.new
end
def create
@asset = Asset.new(params[:asset])
@asset.user_id = params[:user_id] if params[:user_id]
@asset.save!
end
<%= form_for @asset do |f| %>
<%= f.file_field :asset %>
<%= f.text_field :description %><br />
<%=f.submit %>
<% end %>