Rails表单关联 - 从上一页传递id

时间:2015-11-10 08:03:46

标签: ruby-on-rails forms ruby-on-rails-4 associations model-associations

试图找出如何在表单中设置关联。

我有3个型号:

class Request < ActiveRecord::Base
  has many :answers
  has many :users, through: :answers
end

class Answer < ActiveRecord::Base
   belongs to :user
   belongs to :request
end

class User < ActiveRecord::Base
   has many :answers
   has many :requests, through: :answers
end

我想弄清楚:如何从Answer#new获得Request#Show的用户链接,然后创建一个传递来自Request#Show request_id的答案记录上一页 - 在用户的Answer和他正在查看的Request之间创建关联。

我现在执行此操作的方法是:我在request_id上刷新Request#Show值,然后当用户链接到Answer#new时,它会将闪烁的值传递给隐藏的表单标记在答案#new。这似乎不是最好的方法。

有什么想法吗?

3 个答案:

答案 0 :(得分:0)

使用闪光灯的创意方法的荣誉,但你的权利有一个简单的方法。您可以在控制器之间传递很多参数,就像使用路径名在方法之间传递参数一样。

我没有完全按照你在这种情况下想要实现的目标,但看起来这里的博客条目应该让你开始..

https://agilewarrior.wordpress.com/2013/08/31/how-to-pass-parameters-as-part-of-the-url-in-rails/

祝你好运!

答案 1 :(得分:0)

  

来自Answer#new

Request#Show的用户链接

这可以通过sessionsnested resources(或两者兼得!)来实现。让我解释一下:

我肯定会在您的requests路线中添加嵌套资源

#config/routes.rb
resources :requests do
   resources :answers, only: [:new, :create] #-> url.com/requests/:request_id/answers [POST]
end

这使您能够调用“嵌套”路由(IE将数据发送到子控制器,并要求将“父”数据附加到请求中)。

在您的情况下,您要为请求创建答案。最有效的方法是使用如上所述的路由结构;这将允许您使用以下控制器方法:

#app/controllers/answers_controller.rb
class AnswersController < ApplicationController
   def new
      @request = Request.find params[:request_id]
      @answer = @request.answers.new
   end

   def create
      @request = Request.find params[:request_id]
      @answer = @request.answers.new answer_params
      @answer.save
   end

   private

   def answer_params
      params.require(:answer).permit(:title, :body)
   end
end

通过将request_id传递给嵌套路由,您可以创建答案。您必须注意相应的路线需要 POST 方法才能工作。

您不需要new方法。如果您需要,可以使用上述结构轻松处理。

传递用户有点棘手。

您可以 使用路线,或设置会话

我个人会设置一个会话(它更干净):

#app/controllers/requests_controller.rb
class RequestsController < ApplicationController
   def show
      session[:user_id] = @user.id #-> I don't know how you populate @user
   end
end

这将使您能够在此处访问此会话:

#app/controllers/answers_controller.rb
class AnswersController < ApplicationController
   def new
      user = User.find session[:user_id]
   end
end

#app/views/requests/show.html.erb
<%= link_to "New Answer", request_new_answer_path(request) %>

-

如果您正在使用 Devise ,则current_user object中的用户对象应该可用(这意味着您不必设置session[:user_id]):

#app/controllers/answers_controller.rb
class AnswersController < ApplicationController
   def new
      ## current_user available here if using devise
   end
end

要为新@user记录指定answer,只需在answers#create中执行此操作:

#app/controllers/answers_controller.rb
class AnswersController < ApplicationController
   ...

   def create
      @request     = Request.find params[:request_id]
      @answer      = @request.answers.new answer_params
      @answer.user = current_user
      @answer.save
   end

end

答案 2 :(得分:0)

这样的事情对我有用:

  • 我有两个模型(Formula和FormulaMaterial)
  • 公式has_many FormulaMaterials,属于公式
  • 我的公式控制器像这样设置@formula:

    @formula = Formula.find(params [:id])

  • 我在我的Formula show.html.erb中列出了我的公式材料,方法是在我的公式控制器中声明它:

    @formula_materials = FormulaMaterial.where(:formula_id =&gt; @formula)

  • 当我想在我的公式中添加一个新的FormulaMaterial时,&#34;新的公式材料&#34;我的show.html.erb文件中的按钮如下所示:

    <%= link_to 'Add Material To Formula', new_formula_material_path(:formula_id => @formula), class: "btn btn-success" %>
    
  • 在&#34;新_..._路径&#34;我将关联的id设置为@formula变量。当它传递给我的FormulaMaterial的new.html.erb时,我的网址如下:

    http://localhost:3000/formula_materials/new?formula_id=2

  • 在我的FormulaMaterial new.html.erb文件中,我创建了一个hidden_​​field,它通过使用&#34; params&#34;来设置关联的值。访问URL中的formula_id,如下所示:

     params [:formula_id]%&gt;

我不确定这是否是执行此操作的最佳方式,但这种方式允许我每次都将上一页中的视图ID作为隐藏,关联和设置字段传递。

希望这有帮助!