2015-12-14 113 views
-2

比方说,我有一个客户和一个品牌类别(客户有很多品牌和一个品牌属于一个客户)。当用户在特定客户的展示页面上时,他/她可以选择点击按钮以添加新品牌(该按钮重定向到表单以创建新品牌,其中包含用户应该指示的字段该品牌属于哪个客户)。但是,当用户获得该表单时,他/她不必手动指出该品牌属于哪个客户,而是应根据用户正在查看其展示页面的客户的customer_id自动输入信息。如果未查看任何显示页面,则父级customer_id的字段应该为空(因为它是默认设置),用户应该手动输入它。自动填充simple_form字段 - RAILS

有没有办法在Rails中实现这一点?如果是这样,怎么样?

回答

1

你的问题有点难理解,但我们走吧。

首先,你必须创建一个链接到一个新的品牌,像:

<%= link_to 'New brand for #{@customer.name}", new_brand_path(customer_id: @customer.id) %> 

这样,你正在过CUSTOMER_ID为PARAM。

在对新动作的品牌控制器,你会做

def new 
    @customer = Customer.find_by_id(params[:customer_id])   
    @brand = @customer ? Brand.new(customer_id: @customer.id) : Brand.new 
end 

你看到我做了一个例子,说清楚做什么。有更好的方法做,但我想这会引导你通过你想要的。

+2

这样做的问题是,Customer.find将抛出一个错误,如果它不能找到具有该ID的记录。一种更安全的方法是做@customer = Customer.find_by(id:params [:customer_id]) –

+0

有没有一种方法可以隐藏表单中的字段,如果params [:customer_id]被传递,只显示它if它不是? – MPorto

+0

是的。你做: <%除非@客户做 f.input .... 结束%> – Guido

0

在从显示页面中的链接,你可以有这样的事情

<%= link_to 'New Brand', new_brand_path(customer_id: params[:id]) %> 

然后在控制器,你可以有一些代码,检查,看是否CUSTOMER_ID是存在于params哈希表新动作:

@brand.customer = Customer.find(params[:customer_id]) if params[:customer_id] 

现在,当表单呈现时,假设使用form_for @brand,客户字段将被设置。

如果他们从另一个页面(除show以外)链接,那么只是不要在link_to方法调用中传递customer_id:params [:id]。它将绕过控制器中的if语句并且客户将变为空白。

0
@new_brand = @customer.brands.new 

它填充在@new_brand cusomer_id与正确的值