新手问题 简单网站里 M V C 里涉及 `(@group)` `(group)`及类似的代码的问题

jkxruby · 2017年09月30日 · 最后由 pinewong 回复于 2017年09月30日 · 1504 次阅读

程序大致是这样的:一个简单的论坛网站。话题为 group,评论为 post, group 的 model 有titledescription,user_id。post 的 model 有 group_id,user_id,content。user 需要加入/退出 一个 group,成为成员/游客。 user 加入或退出群组 group 是一个多对多的关系。 首先,修改 model/user.rb

def is_member_of?(group)   # AAA  测试是不可以删除,也不可加@,这里(group)应该是作为一个参数吧?
  participated_groups.include?(group)        # BBB
end 

def join!(group)
  participated_groups << group
end

然后在group_controller.rb里定义

def join
  @group = Group.find(params[:id])
  if !current_user.is_member_of?(@group)       # CCC   为什么在 controller里是@group?

    current_user.join!(@group)                       # DDD
    flash[:alert] = "已经加入本版!"
  else
    flash[:warning] = "无解"
 end
  redirect_to group_path(@group)                 # EEE  这里测试可以把(@group)删除,不影响
end

最后这段代码是views/groups/index.html.erb,能一个显示 group 的 title,description,edit,delete,的列表

<% @groups.each do |group| %>      
      <tr>
        <td><%= link_to(group.title, group_path(group)) %></td>     # FFF
        <td><%= group.description %></td>
        <td><%= group.user.email %></td>
        <td>
          <%= link_to "Edit", edit_group_path(group), class: "btn btn-info btn-sm"%> |    # GGG  为什么不可以是@group ?或者不加(group)??
          <%= link_to "Delete", group_path(group), method: :delete, class: "btn btn-warning btn-sm", data: {confirm:"are you sure?"}%>
        </td>
      </tr>
      <% end %>

以上代码我在后方标注 # AAA 等字样的代码都有(@group)(group)结构,我尝试去删除变动观察错误,但基础差,始终不明白为什么有时候有 @ ,有时候又没,有时候后面可以不用加()。希望各位前辈指教一下,谢谢🙏

  • 加不加 @ 都是变量,其中加了 @ 是实例变量,作用域扩大,目的是让 view 中能使用这个变量
  • edit_group_pathgroup_path 这些是 rails 自带的方法,他们需要 id 参数的,但还支持传入一个能响应 id 的对象,就比如 group

其中你提的大部分问题,应该都能从上面两个提示中解决,你多理解一下。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号