2014-06-05 64 views
1

基本上是一个用户是项目主页,他们点击添加新的网站,该网站设置了这样预设在控制器中的参数轨

<%= link_to 'Add Asset', new_website_path(:project_id => "#{@project.id}"), class: 'btn btn-md btn-danger' %> 

,然后他们填写了一些数据表单上。不过,我希望这样,当他们提交该表单时,项目ID(来自他们刚才的项目页面)被保存在网站的project_id变量下,但出于某种原因,这不起作用。

class WebsitesController < ApplicationController 
    def new 
    @project = Project.find(params[:project_id]) 
    @website = Website.new(:type => 'Website', :project_id => @project) 
    end 

    def create 
    @website = current_user.assets.build(website_params) 

    if @website.save 
     flash[:notice] = "Asset successfully added." 
     redirect_to(:controller => 'projects', :action => 'show', :id => @website.project_id) 
    else 
     render(:action => 'new') 
    end 
    end 

    private 

    def website_params 
    params.require(:website).permit(:id, :type,:url, :page_rank, :rev_company ,:social_pages) 
    end 
end 

有什么缺失,为什么这不工作?当我登录控制台时,我添加的所有网站都有一个零的project_id。

当我去到我的浏览器的形式,这是地址:

http://localhost:3000/websites/new?project_id=1 

而且,我认为这是获得正确的项目ID,因为在形式我有着眼于项目ID的条件看它是否是类型的网站,如:

#views/websites/new.html.erb 
<div class="col-md-5 col-md-offset-3"> 
    <div class="panel panel-default newasset"> 
     <div class="panel-heading"> 
      <h3 class="panel-title ptd"><%= "New #{@project.type}" %></h3> 
     </div> 
<div class='panel-body'> 
      <div class='form group'> 
<%= simple_form_for(@website, html: {class: 'form-group' }) do |f| %> 
<% if (@project.type == 'Website') %> 
<div class="col-xs-4 col-xs-offset-3"> 
    <%= f.input :title, label: 'Website Name' %> 
    <%= f.input :url %> 
    <%= f.input :rev_company, label: "Revenue Company" %> 
    <%= f.input :social_pages, label: "Number of Social Sites" %> 
    <%= f.input :page_rank %><br /> 
    <div class="form-actions"> 
    <%= f.button :submit, class: 'btn btn-primary' %> 
</div> 
<% else %> 
You should not see this 
<% end %> 
<% end %> 


     </div> 
     </div> 
    </div> 
</div> 

回答

0

@project是一个对象,数据库必须期待一个整数。 你应该叫:

@project.id 

最好的解决办法反正是做:

def new 
    @project = Project.find(params[:project_id] 
    @website = @project.websites.build(:type => 'Website') 
end 

允许导轨通过模型做他magick协会,如果你已经宣布:所属,和HAS_ONE /多

+0

嘿谢谢你的答案。我该把这个放在哪个方法中?新的或创建方法?这也会创建一个新的项目,每次我想建立一个资产?因为我只希望它创建新网站并将它们添加到现有项目 – HarryLucas

+0

这是用于新方法。 create方法将需要更改id,如另一个答案中所述的project_id。 – tebayoso

3

假设您正在通过:project_id,那么您需要在website_params方法中允许project_id

def website_params 
    params.require(:website).permit(:id, :project_id, :type,:url, :page_rank, :rev_company ,:social_pages) 
    ##         ^
    ##          Permit project_id 
end 

目前,还没有允许的领域project_id这就是为什么它没有得到保存。

对于Rails的4+(与强参数)你需要明确指定哪个你想在数据库中保存的字段。

+0

啊好吧,这是有道理的。我唯一担心的是,我最初确实有这样的想法,但有人告诉我要把它拿出来,因为如果他们想要的话,可以让人们在其中注入不同的project_id。这是正确的还是我stil保护这种方式 – HarryLucas

+0

我试着添加这种方式,但它仍然没有将其添加到网站。我更新了我的问题以包含浏览器请求,以确保我正确传递了project_id。 – HarryLucas

+0

这是因为你正在传递'project_id'作为查询参数,所以它可以作为'params [:project_id]'而不是'params [:website] [:project_id]''访问。 –