Rails在控制器方法之间传递参数

时间:2014-11-13 19:53:51

标签: ruby-on-rails ruby

所以我有2页:欢迎&的信息。

在欢迎页面中,我要求用户输入他们的名字,然后单击一个按钮,将您带到详细信息页面。使用给定名称在db中创建一个条目。

在详情页面中,我要求年龄和性别。这些细节我在db中更新了上一页中输入的名称。

现在,这是我的两种方法。

 def welcome
     @name = params[:name]
     if @fname
       then @record= Names.create({:name => @name})
     end
 end

 def details
     @human=Names.last
     @human.update_attributes({:age=> params[:age], :gender=> params[:gender]})
 end

现在,在上面的代码中,我想使用Names.find_by_id(name_id),而不是使用Names.last。但是如何在这些方法之间传递name_id值?

3 个答案:

答案 0 :(得分:2)

更简单的方法是在不依赖嵌套表单的情况下将新记录的id放在详细信息获取请求的参数中。当用户点击详细信息时,他们需要查看其记录的详细信息。

因此,如果你想要名字/:id / details。

,路由可以包含id

你的控制器

def new    
 Names.create(params)
end

def edit
    @human = Names.find(params[:id])
    #whatever else
end

如果没有ajax,你在这里非常有限。我无法生成整个视图代码,但如果您有两个创建新记录的视图和另一个编辑其详细信息的视图,那么您将走上正确的轨道。

这里更常见的模式是new / edit而不是new / details。

所以在你的路线文件中你只需要做资源:名字。这将创建7条宁静的路线。 请在此处阅读http://guides.rubyonrails.org/routing.html#singular-resources

对于你的第一天铁轨,你已经掌握了基础知识,遵循这种模式将对你有所帮助。

答案 1 :(得分:1)

您可以在欢迎视图表单中使用hidden_​​field:

# views/.../welcome.html.erb
<%= form_for @user, action: :details, ...%>
  ...
  <%= f.hidden_field :name_id, value: @record.id %> 
<% end %>

# users_controller.rb
def details
  @human = Names.find(params[:name_id])
  ...
end 

答案 2 :(得分:1)

有几种方法可以解决这个问题,但一个相当简单的方法是通过会话变量传递自动生成的id,例如。

def welcome
    @name = params[:name]
    if @name 
       @record= Names.create({:name => @name})
       session[:id] =  @record.id
    end
end

def details
    @id = session[:id]
    @human = Names.find_by_id(@id)
end