Rails - 使用 URL 参数创建关联对象
Rails - Creating Associated Object with URL params
我想从组织显示页面创建资产。我需要将组织 ID 传递给资产以进行创建。
# ../models/organisation.rb
has_many :assets
# ../models/asset.rb
belongs_to :organisation
我有一个创建资产的按钮,它在 URL 参数中传递 organisation.id。
# ../views/organisations/show.html.erb
<%= link_to 'New Asset', new_asset_path(:organisation_id => @organisation.id) %>
我可以访问 ../views/assets/new
视图中的 organisation_id
值,但是,当我提交表单时,我收到 “Method not allowed”
错误。
# ../controllers/assets_controller.rb
def create
@asset = Asset.new(params[:organisation_id])
...
end
问题 1:为什么会出现此错误:
Q2:还有其他方法可以将 organisation_id 传递到资产新页面吗? IE。不在 URL.
Q3:如果我只能通过URL传递ID,有没有办法阻止用户篡改? IE。将组织 ID 更改为其他内容并将资产保存到另一个组织。
问题 4:嵌套资源在这种情况下会有帮助吗?
Rails5.0.0.1,Ruby2.3.1
我认为你应该使用:
def create
@asset = Asset.new(organisation_id:params[:organisation_id])
end
Q.1 - 错误是由于模型名称引起的 - "Assets"。这是 Rails.
中的保留字
可以通过将资产管道移动到另一个安装点来修复它。例如:
# config/initializers/assets.rb
Rails.application.config.assets.prefix = '/pipeline_assets'
如此处所述:
您需要告诉 Asset.new
organisation_id
参数的用途,例如:
@asset = Asset.new(:organisation_id => params[:organisation_id])
否则你只是给它传递一个随机数,它会 "wtf is this?" :D
(好吧,从技术上讲,它正在寻找一个新方法的版本,该版本采用一个不是散列的参数......它找不到,然后告诉你该方法不存在...... .但相同的差异)。 ;)
我想从组织显示页面创建资产。我需要将组织 ID 传递给资产以进行创建。
# ../models/organisation.rb
has_many :assets
# ../models/asset.rb
belongs_to :organisation
我有一个创建资产的按钮,它在 URL 参数中传递 organisation.id。
# ../views/organisations/show.html.erb
<%= link_to 'New Asset', new_asset_path(:organisation_id => @organisation.id) %>
我可以访问 ../views/assets/new
视图中的 organisation_id
值,但是,当我提交表单时,我收到 “Method not allowed”
错误。
# ../controllers/assets_controller.rb
def create
@asset = Asset.new(params[:organisation_id])
...
end
问题 1:为什么会出现此错误:
Q2:还有其他方法可以将 organisation_id 传递到资产新页面吗? IE。不在 URL.
Q3:如果我只能通过URL传递ID,有没有办法阻止用户篡改? IE。将组织 ID 更改为其他内容并将资产保存到另一个组织。
问题 4:嵌套资源在这种情况下会有帮助吗?
Rails5.0.0.1,Ruby2.3.1
我认为你应该使用:
def create
@asset = Asset.new(organisation_id:params[:organisation_id])
end
Q.1 - 错误是由于模型名称引起的 - "Assets"。这是 Rails.
中的保留字可以通过将资产管道移动到另一个安装点来修复它。例如:
# config/initializers/assets.rb
Rails.application.config.assets.prefix = '/pipeline_assets'
如此处所述:
您需要告诉 Asset.new
organisation_id
参数的用途,例如:
@asset = Asset.new(:organisation_id => params[:organisation_id])
否则你只是给它传递一个随机数,它会 "wtf is this?" :D
(好吧,从技术上讲,它正在寻找一个新方法的版本,该版本采用一个不是散列的参数......它找不到,然后告诉你该方法不存在...... .但相同的差异)。 ;)