我正在看一个在线项目,偶然发现了我不了解的东西。我有多个Users
,每个用户都有Comments
。在set_user
内同时进行get_comment
和comment_controller
可以吗? button_to
标签最终会传入用户,但只有params[:user_id]
可用。
users / index.html.erb
<h3>All Users and Comments</h3>
<%= render @users %>
users / _user.html.erb
<h4><%= user.username %></h4>
<%= render user.comments %>
<%= button_to "Add comment to User", user_comments_path(user) %>
users_controller.rb
class UsersController < ApplicationController
def index
@users = User.order(:username)
end
end
comments_controller.rb
class CommentsController < ApplicationController
before_action :set_user
def create
@new_comment = @user.comments.create!(content: "Lorem Ipsum")
end
def update
@comment.update_attributes(params.require(:comment).permit(:content))
end
private
def set_user
debugger
@user = User.where(id: get_comment.user_id).first!
end
def get_comment
@comment ||= Comment.where(id: params[:id]).first!
end
end
user_id
设置用户,然后create
动作将创建新的Comment?那意味着我必须拥有2个before_action
的权利?update
操作-因为注释存在,因此它正确获取@user
和@comment
。为了使create
和update
都可以工作,我该怎么办?答案 0 :(得分:1)
这就是我重构您的comments_controller.rb
的方式:
class CommentsController < ApplicationController
before_action :set_user
before_action :get_comment, only: :update
def create
@new_comment = @user.comments.create!(content: "Lorem Ipsum")
end
def update
@comment.update_attributes(params.require(:comment).permit(:content))
end
private
def set_user
debugger
@user = User.find_by_id!(params[:user_id])
end
def get_comment
@comment ||= Comment.find_by_id!(params[:id])
end
end
如果具有用户ID,则要使用该ID来允许这两种控制器方法都起作用。您可以先执行get_comment
操作,然后再运行更新方法。