试图找出如何在表单中设置关联。
我有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。这似乎不是最好的方法。
有什么想法吗?
答案 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
的用户链接
这可以通过sessions
或nested 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:
@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时,我的网址如下:
在我的FormulaMaterial new.html.erb文件中,我创建了一个hidden_field,它通过使用&#34; params&#34;来设置关联的值。访问URL中的formula_id,如下所示:
params [:formula_id]%&gt;我不确定这是否是执行此操作的最佳方式,但这种方式允许我每次都将上一页中的视图ID作为隐藏,关联和设置字段传递。
希望这有帮助!