Rails - 使用URL参数创建关联对象

时间:2016-09-20 02:42:46

标签: ruby-on-rails associations url-parameters

我想从组织显示页面创建资产。我需要将组织ID传递给Asset进行创建。

# ../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) %>

我可以访问organisation_id视图中的../views/assets/new值,但是,当我提交表单时,我收到“Method not allowed”错误。

# ../controllers/assets_controller.rb

def create
    @asset = Asset.new(params[:organisation_id])
    ...
end

Q1:为什么我收到此错误:

Q2:还有另一种方法可以将organisation_id传递到资产新页面吗?即不在网址中。

问题3:如果我只能通过URL传递ID,有没有办法阻止用户篡改它?即将组织ID更改为其他内容并将资产保存到其他组织。

问题4:嵌套资源会在这个实例中有所帮助吗?

Rails 5.0.0.1,Ruby 2.3.1

3 个答案:

答案 0 :(得分:0)

我认为你应该使用:

  def create
    @asset = Asset.new(organisation_id:params[:organisation_id])
  end

答案 1 :(得分:0)

Q.1 - 错误是由于模型的名称 - “资产”。这是Rails中的保留字。

可以通过将资产管道移动到另一个安装点来修复它。例如:

# config/initializers/assets.rb

Rails.application.config.assets.prefix = '/pipeline_assets'

如上所述:

405 Error when trying to POST a file in rails

Rails 4 Method Not Allowed after Upgrading from Rails 3

答案 2 :(得分:0)

您需要告诉Asset.new organisation_id参数是什么,例如:

@asset = Asset.new(:organisation_id => params[:organisation_id])

否则你只是传递一个随机数字而且它已经去了#34; wtf就是这个?&#34; :d

(好吧,从技术上来说,它正在寻找新方法的一个版本,它采用一个不是哈希的单个参数......它无法找到,然后告诉你该方法没有& #39; t存在......但是相同的差异)。 ;)