2014-09-10 34 views
0

这是一个观点摘录 -导轨 - 未能从新传递参数的控制器创建

<%= @user.id %> is the user id 
    <%= @book.id %> is the book id 

    <div class="field"> 
    <%= f.select :contribtype, options_for_select(Contribution::CONTRIB_TYPES) %> 
    </div> 
    <div class="actions"> 
    <%= f.submit %> 
    </div> 
<% end %> 

我还通过了用户的参数,并从以前的观点的书,这样我有

http://localhost:3000/contributions/new?book_id=1&user_id=5 

作为表单的URL。正确的user_id和book_id显示在页面上。

我在控制器中执行以下 -

def new 
    @user = User.find_by_id(params[:user_id]) 
    @book = Book.find_by_id(params[:book_id]) 
    @contribution = Contribution.new(params[book_id: @book.id, user_id: @user.id]) 
    end 

    def create 
    @contribution = Contribution.new(contribution_params) 
.... 

...但USER_ID和book_id未在对象被创建时,它被捕获。我没有收到任何错误,数据根本就没有在新对象中设置。我应该通过不同的参数创建行为吗?

回答

1

我会使用隐藏域作为一个快速修复:

@contribution = Contribution.new 

在HTML:

<%= f.hidden_field :user_id, value: @user.id %> 
<%= f.hidden_field :book_id, value: @book.id %> 

一定要允许在这些领域的contribution_params

+0

我不能接受再回答7分钟,但这已经为我解决了。我是否据此推断,即使您已经在控制器中定义了变量,创建操作将仅使用在提交的表单中的字段中捕获的参数? – RADan 2014-09-10 09:15:53

+0

是的,因为你的实例变量不会在请求之间持久化,http无状态(除非你使用cookies/session) – apneadiving 2014-09-10 09:16:55

+0

Gotcha。非常感谢您为我清除:) – RADan 2014-09-10 09:21:38