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

Rails Form Associations - Passing id From Previous Page

想办法在表单中建立关联。

我有 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

我想弄清楚:如何让用户 link 从 Request#ShowAnswer#new,然后创建一条传入 Request#Show [的答复记录=15=] 来自上一页 - 在用户的 Answer 和他正在查看的 Request 之间创建关联。

我现在这样做的方法是:我在 Request#Show 上闪现 request_id 值,然后当用户 links 到 Answer#new 时,它通过在 Answer#new 上将值闪现到隐藏的表单标签中。这似乎不是执行此操作的最佳方法。

有什么想法吗?

感谢使用 Flash 的创造性方法,但是您的权利有一个简单的方法。您可以在控制器之间传递参数,就像使用路由名称在方法之间传递参数一样。

我不太理解你在这种情况下试图实现的目标,但看起来这篇博客文章应该可以帮助你开始......

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

祝你好运!

User link to Answer#new from Request#Show

这可以通过 sessions or nested resources(或两者!)来实现。让我解释一下:


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

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

这使您能够调用 "nested" 路由(IE 将数据发送到子控制器,并要求将 "parent" 数据附加到请求中)。

在您的情况下,您想要为 请求 创建一个 answer。最有效的方法是使用上面的路由结构;这将允许您使用以下控制器方法:

#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

像这样的东西对我有用:

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

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

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

    @formula_materials = FormulaMaterial.where(:formula_id => @formula)

  • 当我想向我的公式添加新的 FormulaMaterial 时,我的 show.html.erb 文件中的 "New Formula Material" 按钮如下所示:

    <%= link_to 'Add Material To Formula', new_formula_material_path(:formula_id => @formula), class: "btn btn-success" %>
    
  • 在 "new_..._path" 中,我将关联的 id 设置为 @formula 变量。当它传递到我的 FormulaMaterial 的 new.html.erb 时,我的 URL 看起来像这样:

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

  • 在我的 FormulaMaterial new.html.erb 文件中,我创建了一个 hidden_field,它通过使用 "params" 访问 formula_id 来设置关联值在 URL 中像这样:

    参数[:formula_id] %>

我不确定这是否是最好的方法,但这种方法让我每次都能将前一页的视图 ID 作为表单中的隐藏、关联和设置字段传递。

希望对您有所帮助!